PLSQL游标

时间:2022-05-15 10:48:43

静态游标:结果集已经确实(静态定义)的游标。分为隐式和显式游标

隐式游标:所有DML语句为隐式游标,通过隐式游标属性可以获取SQL语句信息;

显式游标:用户显式声明的游标,即指定结果集。当查询返回结果超过一行时,就需要一个显式游标;

REF游标:动态关联结果集的临时对象

静态游标Cursor:隐式游标/显示游标

游标是内存中的一个区域,在DML语句运行时打开,完成后关闭

判断隐式游标的属性

隐式游标

执行DML操作,返回游标情况

declare

begin

update scott.emp set emp.sal=emp.sal*1.3 where emp.job='SALESMAN';

if sql%found then

dbms_output.put_Line(sql%rowcount||' rows has been updated');

elsif sql%notfound then

dbms_output.put_line('0 updated');

end if;

end;

/

4 rows has been updated

PL/SQL procedure successfully completed.

declare

begin

update scott.emp set emp.sal=emp.sal*1.3 where emp.job='SALESMAN';

if sql%found then

dbms_output.put_line(sql%rowcount||' rows has been updated');

elsif sql%notfound then

dbms_output.put_line(sql%rowcount||' rows has been updated');

end if;

end;

/

PLSQL游标

定义显式游标

declare

cursor cur_emp is select * from emp;

v_empRow emp%ROWTYPE;

begin

if cur_emp%isopen then --游标已经打开

null;

Else --游标未打开

open cur_emp;--打开游标

end if;

fetch cur_emp into v_empRow;--取出游标当前行数据

while cur_emp%FOUND loop--判断是否有数据

dbms_output.put_line(cur_emp%ROWCOUNT||'/EMPNO '||v_empROw.ename||',position: '||v_empRow.job||',salary: '||v_empRow.sal);

fetch cur_emp into v_empRow;--把游标指向下一行

end loop;

close cur_emp;--关闭游标

end;

/

1/EMPNO SMITH,position: CLERK,salary: 800

2/EMPNO ALLEN,position: SALESMAN,salary: 1600

3/EMPNO WARD,position: SALESMAN,salary: 1250

4/EMPNO JONES,position: MANAGER,salary: 2975

5/EMPNO MARTIN,position: SALESMAN,salary: 1250

6/EMPNO BLAKE,position: MANAGER,salary: 2850

7/EMPNO CLARK,position: MANAGER,salary: 2450

8/EMPNO SCOTT,position: ANALYST,salary: 3000

9/EMPNO KING,position: PRESIDENT,salary: 5000

10/EMPNO TURNER,position: SALESMAN,salary: 1500

11/EMPNO ADAMS,position: CLERK,salary: 1100

12/EMPNO JAMES,position: CLERK,salary: 950

13/EMPNO FORD,position: ANALYST,salary: 3000

14/EMPNO MILLER,position: CLERK,salary: 1300

定义显示游标流程

定义游标(cur_emp)

If cur_emp%isopen then null

Else open cur_emp

取得一行记录(fetch cur_emp into v_empRow)

如果Cur_emp%found 则执行LOOP循环:

输出当前行记录

取得下一行记录(fetch cur_emp into v_empRow)

回到LOOP循环

关闭游标

使用LOOP循环输出游标

eclare

cursor cur_emp is select * from emp;

v_empRow emp%ROWTYPE;

begin

if cur_emp%isopen then --游标打开

null;

Else --游标未打开

open cur_emp;--打开游标

end if;

loop

fetch cur_emp into v_empRow;取出游标当前行数据

exit when cur_emp%notfound;--如果没有找到数据则退出循环

dbms_output.put_line(cur_emp%ROWCOUNT||'/EMPNO '||v_empROw.ename||',position: '||v_empRow.job||',salary: '||v_empRow.sal);

end loop;

close cur_emp;--关闭游标

end;

/

定义显示游标流程

定义游标(cur_emp)

If cur_emp%isopen then null

Else open cur_emp

LOOP循环:

取出游标当前行数据(fetch cur_emp into v_empRow)

exit when cur_emp%notfound;--如果没有找到数据则退出循环

输出

回到LOOP循环

关闭游标

使用FOR循环操作游标

declare

cursor cur_emp is select * from emp;

begin

for v_empRow in cur_emp loop

dbms_output.put_line(cur_emp%ROWCOUNT||'/ename:'||v_empRow.ename||',position: '||v_empRow.job||',salary: '||v_empRow.sal);

end loop;

end;

/

尽量使用FOR循环操作

在编写游标操作中,使用FOR循环操作游标不仅代码简单,而且可以将游标的状态交给系统去完成

定义游标(cur_emp)

FOR循环判断数据是否在游标内(FOR v_empRow in cur_emp loop)

输出

循环结束

定义参数游标

declare

cursor cur_emp(dno emp.deptno%type) is select * from emp where deptno=dno;

begin

for v_empRow in cur_emp(&deptno) loop

dbms_output.put_line(cur_emp%ROWCOUNT||'/ename:'||v_empRow.ename||',position: '||v_empRow.job||',salar0y: '||v_empRow.sal);

end loop;

end;

/