游标
1. 游标的属性(重点----记)
%FOUND SQL语句影响一行或者多行的时候为true;
%NOTFOUND SQL语句没有影响到任何一行的时候为true(常用)
%ROWCOUNT SQL语句影响的行(返回为数字,数字是几就返回几)
%ISOPEN 游标是否打开始终,为false(游标一结束就自动关闭,要是想测试,可以试试在触发器中测试)
2. 静态游标
静态游标是指结果集已经确定(静态定义)的游标
静态游标分:隐视游标和显示游标
2.1隐视游标
在PL\SQL中隐视游标在执行MDL SQL(Insert/Delete/Update/Select)时自动创建、自动声明、打开和关闭。其名SQL(注:所有隐视游标名都叫SQL)
使用游标的属性:
BEGIN
UPDATE EMP SET SAL = 900 WHERE EMPNO = 7369;
IF SQL%FOUND THEN
DBMS_OUTPUT.PUT_LINE(‘存在’);
END IF;
END;
提示:
在java中,如对表进行增删改操作(没有查询因为查询不会有多少行受影响提示),结果会返回n,表示多少行在数据库中收影响。
我们通过 n>0 and n=0 来判断SQL代码是否执行成功
这个n即是%ROWCOUNT属性。
2.2显示游标
显示游标用于处理SELECT时返回多行的查询
·增删改不会使用显示游标
显示游标需要手动去做:声明、打开、提取、关闭操作;
演示:
·显示游标操作
DECLARE
CURSOR C_SAL IS - - 声明游标
SELECT SALFROM EMP WHERE EMPNO = 7369;
MY_SAL EMP.SAL%TYPE; - - 声明变量(有用接收游标中的数据)
BEGIN
OPEN C_SAL; - - 打开游标
FETCH C_SAL INTO MY_SAL; - - 提取游标(将游标中的值提取出来,要对应上面游标接收的列)
DBMS_OUTPUT.PUT_LINE(MY_SAL); - - 打印输出
CLOSE C_SAL; - - 关闭游标
END;
·带参的游标
DECLARE
CURSOR C_NAME(DOM NUMBER) IS - - 声明游标
SELECT * FROM EMP WHERE EMPNO = DOM;
MY_ROWS EMP%ROWTYPE; - - 声明变量
BEGIN
OPEN (‘&请输入你要查询的部门’); - - 打开游标
LOOP
FETCH C_NAME INTO MY_ROWS; - - 将游标中的值赋给表里
EXIT LOOP C_NAME%NOTFOUND; --如果都没没数据了就退出循环
DBMS_OUTPUT.PUT_LINE(MY_ROWS.ENAME ||’ ’||MY_ROWS.EMPNO ......);
END LOOP;
CLOSE C_NAME;
END;
FOR IN循环游标
作用:简化游标代码处理(可以省略、打开、提取、关闭)
基本语法:
FOR I IN (游标名) LOOP
........
END LOOP;
实例:
DECLARE
CURSOR C_NAME IS
SELECT * FROM EMP ;
BEGIN
FOR I IN C_NAME LOOP
DBMS_OUTPUT.PUT_LINE(I.ENAME||’ ‘||I.EMPNO);
END LOOP;
END;
注释:和foreach一样 , I 为行的类型(%rowtype)自动打开、提取、关闭--新手推荐多用loop循环免的忘记、打开、提取、关闭
带参的for In循环游标
DECLARE
CURSOR C_NAME(DOM NUMBER) IS
SELECT * FROM EMP
BEGIN
FOR I IN C_NAME(‘&请输入你要查询的部门编号’) LOOP
DBMS_OUTPUT.PUT_LINE(I.ENAME||’ ’||I.EMPNO);
END LOOP;
END;
嵌套游标
DECLARE
CURSOR C_DEMPNO IS
SELECT DEPTNO FROM DEPT;
YM_DEPTNO DEPT.DEPTNO%TYPE;
BEGIN
OPEN C_DEMPNO;
LOOP
FETCH C_DEMPNO INTO YM_DEPTNO
END LOOP;
END;