Oracle游标 隐视游标、显示游标

游标

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;

猜你喜欢

转载自blog.csdn.net/qq_40694145/article/details/79059345