开发者社区> 问答> 正文

建立存储过程 CREATE PROCEDURE

已解决

展开
收起
2018-07-03 18:46:34 638 0
1 条回答
写回答
取消 提交回答
  • 采纳回答

    详细解答可以参考官方帮助文档

    CREATE OR REPLACE PROCEDURE list_emp
    IS
      v_empno         NUMBER(4);
      v_ename         VARCHAR2(10);
      CURSOR emp_cur IS
          SELECT empno, ename FROM emp ORDER BY empno;
    BEGIN
      OPEN emp_cur;
      DBMS_OUTPUT.PUT_LINE('EMPNO    ENAME');
      DBMS_OUTPUT.PUT_LINE('-----    -------');
      LOOP
          FETCH emp_cur INTO v_empno, v_ename;
          EXIT WHEN emp_cur%NOTFOUND;
          DBMS_OUTPUT.PUT_LINE(v_empno || '     ' || v_ename);
      END LOOP;
      CLOSE emp_cur;
    END;
    --
    --  Procedure that selects an employee row given the employee
    --  number and displays certain columns.
    --
    CREATE OR REPLACE PROCEDURE select_emp (
      p_empno         IN  NUMBER
    )
    IS
      v_ename         emp.ename%TYPE;
      v_hiredate      emp.hiredate%TYPE;
      v_sal           emp.sal%TYPE;
      v_comm          emp.comm%TYPE;
      v_dname         dept.dname%TYPE;
      v_disp_date     VARCHAR2(10);
    BEGIN
      SELECT ename, hiredate, sal, NVL(comm, 0), dname
          INTO v_ename, v_hiredate, v_sal, v_comm, v_dname
          FROM emp e, dept d
          WHERE empno = p_empno
            AND e.deptno = d.deptno;
      v_disp_date := TO_CHAR(v_hiredate, 'MM/DD/YYYY');
      DBMS_OUTPUT.PUT_LINE('Number    : ' || p_empno);
      DBMS_OUTPUT.PUT_LINE('Name      : ' || v_ename);
      DBMS_OUTPUT.PUT_LINE('Hire Date : ' || v_disp_date);
      DBMS_OUTPUT.PUT_LINE('Salary    : ' || v_sal);
      DBMS_OUTPUT.PUT_LINE('Commission: ' || v_comm);
      DBMS_OUTPUT.PUT_LINE('Department: ' || v_dname);
    EXCEPTION
      WHEN NO_DATA_FOUND THEN
          DBMS_OUTPUT.PUT_LINE('Employee ' || p_empno || ' not found');
      WHEN OTHERS THEN
          DBMS_OUTPUT.PUT_LINE('The following is SQLERRM:');
          DBMS_OUTPUT.PUT_LINE(SQLERRM);
          DBMS_OUTPUT.PUT_LINE('The following is SQLCODE:');
          DBMS_OUTPUT.PUT_LINE(SQLCODE);
    END;
    --
    --  Procedure that queries the 'emp' table based on
    --  department number and employee number or name.  Returns
    --  employee number and name as IN OUT parameters and job,
    --  hire date, and salary as OUT parameters.
    --
    CREATE OR REPLACE PROCEDURE emp_query (
      p_deptno        IN     NUMBER,
      p_empno         IN OUT NUMBER,
      p_ename         IN OUT VARCHAR2,
      p_job           OUT    VARCHAR2,
      p_hiredate      OUT    DATE
      p_sal           OUT    NUMBER
    )
    IS
    BEGIN
      SELECT empno, ename, job, hiredate, sal
          INTO p_empno, p_ename, p_job, p_hiredate, p_sal
          FROM emp
          WHERE deptno = p_deptno
            AND (empno = p_empno
             OR  ename = UPPER(p_ename));
    END;
    --
    --  Procedure to call 'emp_query_caller' with IN and IN OUT
    --  parameters.  Displays the results received from IN OUT and
    --  OUT parameters.
    --
    CREATE OR REPLACE PROCEDURE emp_query_caller
    IS
      v_deptno        NUMBER(2);
      v_empno         NUMBER(4);
      v_ename         VARCHAR2(10);
      v_job           VARCHAR2(9);
      v_hiredate      DATE;
      v_sal           NUMBER;
    BEGIN
      v_deptno := 30;
      v_empno  := 0;
      v_ename  := 'Martin';
      emp_query(v_deptno, v_empno, v_ename, v_job, v_hiredate, v_sal);
      DBMS_OUTPUT.PUT_LINE('Department : ' || v_deptno);
      DBMS_OUTPUT.PUT_LINE('Employee No: ' || v_empno);
      DBMS_OUTPUT.PUT_LINE('Name       : ' || v_ename);
      DBMS_OUTPUT.PUT_LINE('Job        : ' || v_job);
      DBMS_OUTPUT.PUT_LINE('Hire Date  : ' || v_hiredate);
      DBMS_OUTPUT.PUT_LINE('Salary     : ' || v_sal);
    EXCEPTION
      WHEN TOO_MANY_ROWS THEN
          DBMS_OUTPUT.PUT_LINE('More than one employee was selected');
      WHEN NO_DATA_FOUND THEN
          DBMS_OUTPUT.PUT_LINE('No employees were selected');
    END;
    2018-07-09 01:39:02
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载