zoukankan      html  css  js  c++  java
  • Oracle存储过程中游标的简单使用

    存储过程中查询语句如何返回多行结果?
    我们知道,如果存储过程中查询语句有多行结果输出,会报错:ORA-01422: exact fetch returns more than requested number of rows
    若想让存储过程中的查询语句返回多行结果不报错,则需要使用游标来实现。
    本例主要也是用来熟悉存储过程中游标的简单使用方法。案例所涉及的数据表使用的是oracle自带的scott用户。

    1.打开输出选项

    SET SERVEROUTPUT ON;
    

    2.创建查询员工薪水的存储过程

    create or replace procedure proc_salary is 
    
      --定义变量
      v_empno emp.empno%TYPE;
      v_ename emp.ename%TYPE;
      v_sal emp.sal%TYPE;
      
      --定义游标
      CURSOR emp_cursor IS
      SELECT empno, ename, sal from emp;
      
    BEGIN
    
    --循环开始
    LOOP
    
      IF NOT emp_cursor%ISOPEN  THEN
         OPEN emp_cursor;
      END IF; 
      
      FETCH emp_cursor INTO  v_empno, v_ename, v_sal; 
      --退出循环的条件
      EXIT WHEN emp_cursor%NOTFOUND OR emp_cursor%NOTFOUND IS NULL;
     
      dbms_output.put_line('员工编号为' || v_empno || '的' || v_ename || '薪水为:' || v_sal);
        
    END LOOP;
    
    END;
    /
    

    3.执行存储过程
    exec proc_salary;

    SQL> exec proc_salary;
    员工编号为7369的SMITH薪水为:800
    员工编号为7499的ALLEN薪水为:1600
    员工编号为7521的WARD薪水为:1250
    员工编号为7566的JONES薪水为:2975
    员工编号为7654的MARTIN薪水为:1250
    员工编号为7698的BLAKE薪水为:2850
    员工编号为7782的CLARK薪水为:2450
    员工编号为7788的SCOTT薪水为:3000
    员工编号为7839的KING薪水为:5000
    员工编号为7844的TURNER薪水为:1500
    员工编号为7876的ADAMS薪水为:1100
    员工编号为7900的JAMES薪水为:950
    员工编号为7902的FORD薪水为:3000
    员工编号为7934的MILLER薪水为:1300
    
    PL/SQL procedure successfully completed.
    
    Elapsed: 00:00:00.00
    
  • 相关阅读:
    什么是 bean 的自动装配?
    什么是 Spring 的内部 bean?
    什么是 Spring 的 MVC 框架?
    Spring AOP and AspectJ AOP 有什么区别?
    解释 JDBC 抽象和 DAO 模块?
    volatile 类型变量提供什么保证?
    一个 Spring Bean 定义 包含什么?
    什么是 Spring MVC 框架的控制器?
    使用 Spring 访问 Hibernate 的方法有哪些?
    什么是 Callable 和 Future?
  • 原文地址:https://www.cnblogs.com/jyzhao/p/6958260.html
Copyright © 2011-2022 走看看