Oracle pl/sql编程之游标操作
来源:程序员人生 发布时间:2016-04-12 10:28:10 阅读次数:3461次
在通过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 游标名[(参数1 数据类型[参数2 数据类型...])]
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 游标名[(参数1 数据类型[参数2 数据类型...])];
例如,要打开上面声明的游标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;
生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠