源码-PL/SQL从入门到精通-第十章-使用游标-Part 1
来源:互联网 发布:kali linux是什么 编辑:程序博客网 时间:2024/06/02 17:28
心得:在PL/SQL Developer中调试代码时,不能准确提示行号,此时,可将代码段复制到sqlplus界面,能准确提示出错的行数,帮助发现问题所在。
第一次接触Oracle时,感觉游标是个很高大上的概念。最近才发现游标和C语言中的指针类似,不是什么高深的概念。正所谓,“难者不会,会者不难”
--第10章开始--代码10.1在PL/SQL中使用游标DECLARE emprow emp%ROWTYPE; --定义保存游标检索结果行的记录变量 CURSOR emp_cur --定义游标 IS SELECT * FROM emp WHERE deptno IS NOT NULL;BEGIN OPEN emp_cur; --打开游标 LOOP --循环检索游标 FETCH emp_cur --提取游标内容 INTO emprow; --输出检索到的游标行的信息 DBMS_OUTPUT.put_line ( '员工编号:' || emprow.empno || ' ' || '员工名称:' || emprow.ename ); EXIT WHEN emp_cur%NOTFOUND; --当游标数据检索完成退出循环 END LOOP; CLOSE emp_cur; --关闭游标END;SELECT * FROM emp;--代码10.2 在PL/SQL中使用隐式游标BEGIN UPDATE emp SET comm = comm * 1.12 WHERE empno = 7687; --更新员工编号为7369的员工信息 --使用隐式游标属性判断已更新的行数 DBMS_OUTPUT.put_line (SQL%ROWCOUNT || ' 行被更新'); --如果没有任何更新 IF SQL%NOTFOUND THEN --显示未更新的信息 DBMS_OUTPUT.put_line ('不能更新员工号为7369的员工!'); END IF; --向数据库提交更改 COMMIT;EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.put_line (SQLERRM); --如果出现异常,显示异常信息END;--代码10.3 简单的游标定义语句DECLARE CURSOR emp_cursor --定义一个查询emp表中部门编号为20的游标 IS SELECT * FROM emp WHERE deptno = 20;BEGIN NULL;END;--代码10.4 根据变量查询emp表DECLARE v_deptno NUMBER; CURSOR emp_cursor --定义一个查询emp表中部门编号为20的游标 IS SELECT * FROM emp WHERE deptno = v_deptno;BEGIN v_deptno:=&v_deptno; OPEN emp_cursor; --打开游标 IF emp_cursor%ISOPEN THEN DBMS_OUTPUT.PUT_LINE('游标已经被打开'); END IF;END;--代码10.5 声明游标参数(这参数是干什么的?)DECLARE CURSOR emp_cursor (p_deptno IN NUMBER) --定义游标并指定游标参数 IS SELECT * FROM emp WHERE deptno = p_deptno;BEGIN OPEN emp_cursor (20);END;--代码10.6 指定游标的返回类型 --声明游标并指定游标返回值类型 DECLARE CURSOR emp_cursor (p_deptno IN NUMBER) RETURN emp%ROWTYPEIS SELECT * FROM emp WHERE deptno = p_deptno; BEGIN OPEN emp_cursor (20); --打开游标END;--代码10.7 %ISOPEN游标属性使用示例DECLARE CURSOR emp_cursor (p_deptno IN NUMBER) --定义游标并指定游标参数 IS SELECT * FROM emp WHERE deptno = p_deptno;BEGIN IF NOT emp_cursor%ISOPEN THEN --如果游标还没有被打开 OPEN emp_cursor (20); --打开游标 END IF; IF emp_cursor%ISOPEN THEN --判断游标状态,显示状态信息 DBMS_OUTPUT.PUT_LINE('游标已经被打开!'); ELSE DBMS_OUTPUT.PUT_LINE('游标还没有被打开!'); END IF; END;--代码10.8 %found游标属性示例DECLARE emp_row emp%ROWTYPE; --定义游标值存储变量 CURSOR emp_cursor (p_deptno IN NUMBER) --定义游标并指定游标参数 IS SELECT * FROM emp WHERE deptno = p_deptno;BEGIN IF NOT emp_cursor%ISOPEN THEN --如果游标还没有被打开 OPEN emp_cursor (20); --打开游标 END IF; IF emp_cursor%FOUND IS NULL --在使用FETCH提取游标数据之前,值为NULL THEN DBMS_OUTPUT.put_line ('%FOUND属性为NULL'); --输出提示信息 END IF; LOOP --循环提取游标数据 FETCH emp_cursor INTO emp_row; --使用FETCH语句提取游标数据 --每循环一次判断%FOUND属性值,如果该值为False,表示提取完成,将退出循环。 EXIT WHEN NOT emp_cursor%FOUND; END LOOP;END;--%notfound游标属性示例DECLARE emp_row emp%ROWTYPE; --定义游标值存储变量 CURSOR emp_cursor (p_deptno IN NUMBER) --定义游标并指定游标参数 IS SELECT * FROM emp WHERE deptno = p_deptno;BEGIN OPEN emp_cursor (20); --打开游标 IF emp_cursor%NOTFOUND IS NULL --在使用FETCH提取游标数据之前,值为NULL THEN DBMS_OUTPUT.put_line ('%NOTFOUND属性为NULL'); --输出提示信息 END IF; LOOP --循环提取游标数据 FETCH emp_cursor INTO emp_row; --使用FETCH语句提取游标数据 DBMS_OUTPUT.PUT_LINE('当前已提取的行数为:'||emp_cursor%ROWCOUNT||' 行!'); --每循环一次判断%FOUND属性值,如果该值为False,表示提取完成,将退出循环。 EXIT WHEN emp_cursor%NOTFOUND; END LOOP;END;--代码10.10 %Rowcount游标属性使用示例DECLARE emp_row emp%ROWTYPE; --定义游标值存储变量 CURSOR emp_cursor (p_deptno IN NUMBER) --定义游标并指定游标参数 IS SELECT * FROM emp WHERE deptno = p_deptno;BEGIN OPEN emp_cursor (20); --打开游标 LOOP --循环提取游标数据 FETCH emp_cursor INTO emp_row; --使用FETCH语句提取游标数据 --每循环一次判断%FOUND属性值,如果该值为False,表示提取完成,将退出循环。 EXIT WHEN emp_cursor%NOTFOUND; DBMS_OUTPUT.PUT_LINE('当前已提取的行数为:'||emp_cursor%ROWCOUNT||' 行!'); END LOOP; CLOSE emp_cursor;END;--代码10.11 使用Fetch语句提取游标数据SELECT * FROM dept;DECLARE deptno dept.deptno%TYPE; --定义保存游标数据的变量 dname dept.dname%TYPE; loc dept.loc%TYPE; dept_row dept%ROWTYPE; --定义记录变量 CURSOR dept_cur IS SELECT * FROM dept; --定义游标BEGIN OPEN dept_cur ; --打开游标 LOOP IF dept_cur%ROWCOUNT<=4 THEN --判断如果当前提取的游标小于等于4行 FETCH dept_cur INTO dept_row; --提取游标数据到记录类型中 IF dept_cur%FOUND THEN --如果FETCH到数据,则进行显示 DBMS_OUTPUT.PUT_LINE(dept_row.deptno||' '||dept_row.dname||' '||dept_row.loc); END IF; ELSE FETCH dept_cur INTO deptno,dname,loc;--否则提取记录到变量列表中 IF dept_cur%FOUND THEN --如果提取到数据则进行显示 DBMS_OUTPUT.PUT_LINE(deptno||' '||dname||' '||loc); END IF; END IF; EXIT WHEN dept_cur%NOTFOUND; --判断是否提取完成 END LOOP; CLOSE dept_cur;END;--代码10.12 使用bulk collect语句批量提取游标数据DECLARE TYPE depttab_type IS TABLE OF dept%ROWTYPE; --定义dept行类型的嵌套表类型 depttab depttab_type; --定义嵌套表变量 CURSOR deptcur IS SELECT * FROM dept; --定义游标BEGIN OPEN deptcur; FETCH deptcur BULK COLLECT INTO depttab; --使用BULK COLLECT INTO子句批次插入 FOR i IN 1 .. depttab.COUNT --循环嵌套表变量中的数据 LOOP DBMS_OUTPUT.put_line ( depttab (i).deptno || ' ' || depttab (i).dname || ' ' || depttab (i).loc ); END LOOP; CLOSE deptcur; --关闭游标END;--使用bulk colect limit语句批量提取游标数据DECLARE TYPE dept_type IS VARRAY (4) OF dept%ROWTYPE; --定义变长数组类型 depttab dept_type; --定义变长数组变量 CURSOR dept_cursor --定义打开dept的游标 IS SELECT * FROM dept; v_rows INT := 4; --使用LIMIT限制的行数 v_count INT := 0; --保存游标提取过的行数BEGIN OPEN dept_cursor; --打开游标 LOOP --循环提取游标 --每次提取4行数据到变长数组中 FETCH dept_cursor BULK COLLECT INTO depttab LIMIT v_rows; EXIT WHEN dept_cursor%NOTFOUND; --没有游标数据时退出 DBMS_OUTPUT.put('部门名称:'); --输出部门名称 --循环提取变长数组数据,因为变长数组只能存放4个元素,因此不能越界读取 FOR i IN 1 .. (dept_cursor%ROWCOUNT - v_count) LOOP DBMS_OUTPUT.put (depttab (i).dname || ' '); --输出部门名称 END LOOP; DBMS_OUTPUT.new_line; --输出新行 v_count := dept_cursor%ROWCOUNT; --为v_count赋新的值 END LOOP; CLOSE dept_cursor; --关闭游标END;
0 0
- 源码-PL/SQL从入门到精通-第十章-使用游标-Part 1
- 源码-PL/SQL从入门到精通-第十章-使用游标-Part 2
- 源码-PL/SQL从入门到精通-第二章-PL/SQL基本概念-Part 1
- 源码-PL/SQL从入门到精通-第十八章-PL/SQL性能优化建议-Part 1
- 源码-PL/SQL从入门到精通-第九章-SQL内置函数-Part 1
- 源码-PL/SQL从入门到精通-第十六章-动态SQL语句-Part 1
- 源码-PL/SQL从入门到精通-第三章-变量和类型-Part 1
- 源码-PL/SQL从入门到精通-第六章-查询数据表-Part 1
- 源码-PL/SQL从入门到精通-第八章-记录与集合-Part 1
- 源码-PL/SQL从入门到精通-第十二章-异常处理机制-Part 1
- 源码-PL/SQL从入门到精通-第十三章-子程序-Part 1
- 源码-PL/SQL从入门到精通-第十四章-包-Part 1
- 源码-PL/SQL从入门到精通-第十五章-触发器-Part 1
- 源码-PL/SQL从入门到精通-第十七章-面向对象编程-Part 1
- 源码-PL/SQL从入门到精通-第二章-PL/SQL基本概念-Part 2
- 源码-PL/SQL从入门到精通-第二章-PL/SQL基本概念-Part 3
- 源码-PL/SQL从入门到精通-第十八章-PL/SQL性能优化建议-Part 2
- 源码-PL/SQL从入门到精通-第九章-SQL内置函数-Part 2
- Spring-10:通过工厂方法配置Bean
- MKDEV(int major,int minor)
- hdu 5730 Shell Necklace(2016多校第一场)FFT+分治
- 二维数组的创建与遍历(php)
- 2016 Multi-University Training Contest 1 1007 Rigid Frameworks
- 源码-PL/SQL从入门到精通-第十章-使用游标-Part 1
- eclipse安装svn插件
- C++ vector用法初记
- Linux-DTS基础
- 2016/07/20
- 《Hive编程指南》学习笔记
- 写一个android小闹钟
- Git版本恢复命令reset
- 1068. Find More Coins (30)