create or replace PROCEDURE PROC_STU3 AS
BEGIN
--显示游标使用,使用for循环
declare
--定义游标,名称为cur_stu
cursor cur_stu is
select stuno,stuname from student order by stuno;
begin
for stu in cur_stu
loop
dbms_output.PUT_LINE(stu.stuno||'->'||stu.stuname);
--循环做隐含检查 %notfound
end loop;
--自动关闭游标
end;
END PROC_STU3;
proc_1:
create or replace procedure proc_1 as
BEGIN
DECLARE
emp_id employees.employee_id%type;
CURSOR cur IS
SELECT b.employee_id, b.ROWID ROW_ID
FROM employees b
ORDER BY b.ROWID;
BEGIN
FOR row IN cur LOOP
DBMS_OUTPUT.PUT_LINE('last name: '||row.employee_id||'--'||row.ROW_ID);
END LOOP;
END;
end proc_1;
proc_2:
create or replace procedure proc_2 as
BEGIN
declare
cursor emp_cursor is select ename,sal from emp where deptno=10;--定义游标,指定游标所对应的
v_ename emp.ename%type; ---定义接收游标数据的变量
v_sal emp.sal%type; ---定义接收游标数据的变量
begin
open emp_cursor; ----打开游标
loop ---取多条数据,循环题
fetch emp_cursor into v_ename,v_sal; ----提取数据
exit when emp_cursor%notfound; -----当没去取到数据的时候退出
dbms_output.put_line(v_ename||': '||v_sal);
end loop; ----退出
close emp_cursor; ----关闭
end;
end proc_2;
那么不关闭游标有什么影响呢?
按oracle文档的要求和编写数据库代码的好的习惯, 绝对要对一个已经用完的游标关闭掉, 如果不想写这些语句你可以用for loop游标的方法!
用完就得关闭,否则就会占用资源。
SESSION关闭的时候游标会自动释放。
循环外关闭cursor:
create or replace procedure proc_100 as
BEGIN
declare
cursor emp_cursor is select ename,sal from emp where deptno=10;
v_ename emp.ename%type;
v_sal emp.sal%type;
begin
open emp_cursor;
loop
fetch emp_cursor into v_ename,v_sal;
exit when emp_cursor%notfound;
dbms_output.put_line(v_ename||': '||v_sal);
close emp_cursor;
end loop;
close emp_cursor;
end;
end proc_100;
可以
SQL> create or replace procedure proc_100 as
BEGIN
declare
cursor emp_cursor is select ename,sal from emp where deptno=10;
v_ename emp.ename%type;
v_sal emp.sal%type;
begin
open emp_cursor;
loop
fetch emp_cursor into v_ename,v_sal;
exit when emp_cursor%notfound;
dbms_output.put_line(v_ename||': '||v_sal);
close emp_cursor;
end loop;
close emp_cursor;
end;
close emp_cursor;
end proc_100; 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
19 /
Warning: Procedure created with compilation errors.
SQL> show err
Errors for PROCEDURE PROC_100:
LINE/COL ERROR
-------- -----------------------------------------------------------------
17/5 PL/SQL: SQL Statement ignored
17/11 PLS-00201: identifier 'EMP_CURSOR' must be declared
报错 关闭游标有,必须重新定义