程序员人生 网站导航

Oracle pl/sql编程之游标操作

栏目:数据库应用时间:2016-04-12 10:28:10

在通过select语句查询是,返回的结果通常是多行记录组成的集合。为此SQL提供了游标机制。游标可以充当指针的作用,使利用程序设计语言1次只能处理查询记过中的1行。在Oracle中,可使用隐式和显示两种游标。在pl/sql中程序所有发出的DML和select语句,Oracle都会自动声明“隐式游标”。为了处理由select语句返回的1组记录,需要在pl/sql程序中申明和处理“显示游标”。


隐式游标

游标的主要属性以下:
%found 布尔型属性,如果SQL语句最少影响1行,则为true,否则为false
%notfound 布尔型属性,与%found相反
%isopen 布尔型属性,当游标已打开时返回true,游标关闭为false
%rowcount 数字型属性,返回受sql语句影响的行数

如果履行了1个select语句则可以通过SQL%ROWCONT来检查受影响的行数,还可以通过SQL%FOUND属性值是不是为true,以检查SQL语句是不是影响到了任何行。

begin update emp set sal=850 where ename=SMITH; if sql%notfound then dbms_output.put_line(未更行任何记录); else dbms_output.put_line(更新记录||sql%rowcount||条); end if; end;


在使用游标的属性值时,需要注意1个重要的事项。游标的属性信息总是反应最新的SQL语句处理结果。因此,当在1个程序块中出现多个sql语句时,需要斟酌在何处检查属性值

declare emp_row emp%rowtype; begin update emp set sal=1800 where ename=SMITH; dbms_output.put_line(更新||sql%rowcount||条记录); select * into emp_row from emp where ename=SMITH; dbms_output.put_line(检索到||sql%rowcount||条记录); end;

另外一种情势的隐式游标是cursor for loop,可以用于处理sql返回的结果集。
begin for empcursor in(select * from emp) loop dbms_output.put_line(姓名:||empcursor.ename); end loop; end;

显示游标

显示游标是在pl/sql程序中使用包括select语句来声明的游标。如果需要处理从数据库中检索的1组记录,则可使用显示游标。使用显示游标处理数据需要4个PL/SQL步骤
声明游标,打开游标,检索数据和关闭游标

声明游标


CURSOR 游标名[(参数数据类型[参数数据类型...])]

IS SELECT语句;

declare cursor emp_cursor(v_name in varchar2 default SMITH) is select * from emp where ename=v_name;

以上代码定义1个名为emp_cursor的游标,并为其规定了输入参数为‘v_name’,该参数为1个字符串数据类型,其默许值为‘SMITH



打开和关闭游标


打开游标就是履行声明游标所指定的查询语句。游标必须声明后才能打开,打开游标也就是调用游标中的select语句。打开游标的进程非常简单,只需要使用关键字OPEN并指定打开的游标名及传递的参数值
open 游标名[(参数数据类型[参数数据类型...])];
 例如,要打开上面声明的游标emp_cursor,可使用以下代码:
open emp_cursor;
如果履行该语句,其输入的参数就是默许值,将会把SMITH的信息查询出来,如果要查KING 的信息
open emp_cursor(KING );

关闭游标使得用户不能再从查询结果中检索数据。使用完游标后应当马上关闭游标,释放select查询结果。如果关闭上面定义的游标emp_cursor,可使用以下语句:
close emp_cursor;

检索数据

检索数据就是从检索到的结果集中获得数据保存到变量中,以遍在程序中进行处理。这4个操作步骤在程序中是顺次进行的,即只有先声明游标才能打开,1旦打开游标就可以从获得数据,当不需要数据时就关闭游标
游标声明中的select语句返回1组数据,open语句履行了select语句,close语句释放select语句的查询结果。而这1切工作都是为了从检索数据
检索数据使用fetch语句找出结果集中的单行,并从中提取单个值传给主变量语法以下:
fetch cursor_name into {variable_list|recod_variable};

列子:
declare cursor emp_cursor(v_deptno in number) is select * from emp where deptno=v_deptno; type cursor_result is record( cursor_result_empno emp.empno%type, cursor_result_ename emp.ename%type, cursor_result_job emp.job%type, cursor_result_mgr emp.mgr%type, cursor_result_hiredate emp.hiredate%type, cursor_result_sal emp.sal%type, cursor_result_comm emp.comm%type, cursor_result_deptno emp.deptno%type ); v_cursor_result cursor_result; begin open emp_cursor(10); LOOP FETCH emp_cursor into v_cursor_result; exit when emp_cursor%notfound; dbms_output.put_line(v_cursor_result.cursor_result_empno); dbms_output.put_line(v_cursor_result.cursor_result_ename); dbms_output.put_line(v_cursor_result.cursor_result_job); dbms_output.put_line(v_cursor_result.cursor_result_mgr); dbms_output.put_line(v_cursor_result.cursor_result_hiredate); dbms_output.put_line(v_cursor_result.cursor_result_sal); dbms_output.put_line(v_cursor_result.cursor_result_comm); dbms_output.put_line(v_cursor_result.cursor_result_deptno); dbms_output.put_line(========================================); end loop; close emp_cursor; end;

游标for循环


在pl/sql中还有1种更加方便的使用显示游标的方法,那就是游标for循环,游标for循环是显示游标的1种快捷方式,它使用for循环顺次读取结果集中的行数据,当for循环开始时游标自动打开(不需要使用open方法)每循环顺次,系统自动读取游标当前行的数据(不需要使用FETCH),当退出for循环时,游标自动关闭(不需要使用close)

declare cursor emp_cursor(v_deptno in number default 10) is select * from emp where deptno=v_deptno; begin for r in emp_cursor loop dbms_output.put_line(r.empno); dbms_output.put_line(r.ename); dbms_output.put_line(r.job); dbms_output.put_line(r.mgr); dbms_output.put_line(r.hiredate); dbms_output.put_line(r.sal); dbms_output.put_line(r.comm); dbms_output.put_line(r.deptno); dbms_output.put_line(========================================); end loop; end;
------分隔线----------------------------
------分隔线----------------------------

最新技术推荐