度量快速开发平台-专业、快速的软件定制快开平台

标题: Oracle存储过程中游标的简单使用 [打印本页]

作者: 张兴康    时间: 2020-2-15 16:13
标题: Oracle存储过程中游标的简单使用
存储过程中查询语句如何返回多行结果?
我们知道,如果存储过程中查询语句有多行结果输出,会报错:ORA-01422: exact fetch returns more than requested number of rows
若想让存储过程中的查询语句返回多行结果不报错,则需要使用游标来实现。
1.打开输出选项

  1. SET SERVEROUTPUT ON;
复制代码
2.创建查询员工薪水的存储过程
  1. create or replace procedure proc_salary is

  2.   --定义变量
  3.   v_empno emp.empno%TYPE;
  4.   v_ename emp.ename%TYPE;
  5.   v_sal emp.sal%TYPE;
  6.   
  7.   --定义游标
  8.   CURSOR emp_cursor IS
  9.   SELECT empno, ename, sal from emp;
  10.   
  11. BEGIN

  12. --循环开始
  13. LOOP

  14.   IF NOT emp_cursor%ISOPEN  THEN
  15.      OPEN emp_cursor;
  16.   END IF;
  17.   
  18.   FETCH emp_cursor INTO  v_empno, v_ename, v_sal;
  19.   --退出循环的条件
  20.   EXIT WHEN emp_cursor%NOTFOUND OR emp_cursor%NOTFOUND IS NULL;

  21.   dbms_output.put_line('员工编号为' || v_empno || '的' || v_ename || '薪水为:' || v_sal);
  22.    
  23. END LOOP;

  24. END;
  25. /
复制代码
3.执行存储过程
exec proc_salary;
  1. SQL> exec proc_salary;
  2. 员工编号为7369的SMITH薪水为:800
  3. 员工编号为7499的ALLEN薪水为:1600
  4. 员工编号为7521的WARD薪水为:1250
  5. 员工编号为7566的JONES薪水为:2975
  6. 员工编号为7654的MARTIN薪水为:1250
  7. 员工编号为7698的BLAKE薪水为:2850
  8. 员工编号为7782的CLARK薪水为:2450
  9. 员工编号为7788的SCOTT薪水为:3000
  10. 员工编号为7839的KING薪水为:5000
  11. 员工编号为7844的TURNER薪水为:1500
  12. 员工编号为7876的ADAMS薪水为:1100
  13. 员工编号为7900的JAMES薪水为:950
  14. 员工编号为7902的FORD薪水为:3000
  15. 员工编号为7934的MILLER薪水为:1300

  16. PL/SQL procedure successfully completed.

  17. Elapsed: 00:00:00.00
复制代码






作者: 张兴康    时间: 2020-2-15 16:13

作者: 张兴康    时间: 2020-2-15 16:21

作者: fteair    时间: 2020-2-15 17:16

作者: fteair    时间: 2020-2-15 17:17

作者: fteair    时间: 2020-2-16 17:56

作者: fteair    时间: 2020-2-16 17:57

作者: 张兴康    时间: 2020-2-22 13:43





欢迎光临 度量快速开发平台-专业、快速的软件定制快开平台 (http://bbs.delit.cn/) Powered by Discuz! X3.2