游标分显示游标跟隐式游标,它们都具有%FOUND、%NOTFOUND、%ISOPEN、%ROWCOUNT四个属性。
%FOUND:如果SQL语句至少影响到一行数据,则该属性为true,反之为false。
%NOTFOUND:与%FOUND相反。
%ISOPEN:判断游标是否打开。
%ROWCOUNT:返回爱SQL语句影响的行数。
1.显示游标
Oracle的游标可以设置参数值,如下,IN表示参数的方向,可以省略,参数的类型不需要指定长度
1 2 | DECLARE CURSOR emp_cur(jobName IN VARCHAR2:= 'SALESMAN' ) IS SELECT EMPNO,ENAME,SAL FROM EMP WHERE JOB=jobName; |
1.1用变量接收值。游标循环时用参数接收值,类似于MS SQL SERVER 的游标。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | DECLARE EMP_NO EMP.EMPNO%TYPE; EMP_NAME EMP.ENAME%TYPE; EMP_SAL EMP.SAL%TYPE; BEGIN OPEN emp_cur( 'MANAGER' ); --打开游标 FETCH emp_cur INTO EMP_NO,EMP_NAME,EMP_SAL; --读取第一行 WHILE emp_cur%FOUND LOOP --循环判断,用%FOUND 返回TRUE则表示读取到了 DBMS_OUTPUT.put_line( 'FETCH CURSOR--' ||EMP_NO|| '--' ||EMP_NAME|| '--' || '--' ||EMP_SAL); FETCH emp_cur INTO EMP_NO,EMP_NAME,EMP_SAL; --读取下一行 END LOOP; END ; END ; |
1.2 用记录类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | DECLARE CURSOR cur_emp(var_job IN VARCHAR2:= 'SALESMAN' ) IS SELECT EMPNO,ENAME,SAL FROM EMP WHERE JOB=var_job; TYPE emp_record IS RECORD --定义记录类型 ( EMPNO EMP.EMPNO%TYPE, ENAME EMP.ENAME%TYPE, SAL EMP.SAL%TYPE ); emp_row emp_record; --定义类型对象 BEGIN OPEN cur_emp( 'MANAGER' ); FETCH cur_emp INTO emp_row; --读取数据到记录对象 WHILE cur_emp%FOUND LOOP DBMS_OUTPUT.put_line(emp_row.EMPNO|| '--' ||emp_row.ENAME|| '--' || '--' ||emp_row.SAL); FETCH cur_emp INTO emp_row; END LOOP; CLOSE cur_emp; --关闭游标 END ; |
1.3 FOR循环读取游标
1.3.1 读取游标
1 2 3 4 5 6 7 | DECLARE CURSOR mycur(VAR_JOB VARCHAR2:= 'SALESMAN' ) IS SELECT * FROM EMP WHERE JOB=VAR_JOB; BEGIN FOR cur IN mycur LOOP DBMS_OUTPUT.put_line(cur.EMPNO|| '--' ||cur.ENAME|| '--' || '--' ||cur.SAL|| '--' ||cur.JOB); END LOOP; END ; |
1.3.2 直接循环SQL语句
1 2 3 | FOR cur IN ( SELECT * FROM EMP) LOOP DBMS_OUTPUT.put_line( 'FOR--' ||cur.EMPNO|| '--' ||cur.ENAME|| '--' || '--' ||cur.SAL|| '--' ||cur.JOB); END LOOP; |
2.隐式游标
2.1在执行一个SQL,ORACLE会自动的创建一个隐式游标,如INSERT,UPDATE,DELETE语句。使用时需要在属性前面加上隐式游标默认的标识--SQL
1 2 3 4 5 6 | --INSERT INTO EMP VALUES('7935','KEN','ENGINEER',7902,SYSDATE,2000,'',20);<br>UPDATE EMP SET SAL=SAL+100; IF SQL%NOTFOUND THEN DBMS_OUTPUT.put_line( 'NOTFOUND' ); ELSE DBMS_OUTPUT.put_line(SQL%ROWCOUNT|| '受影响' ); END IF; |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端