存储过程是一个命名的程序块,包括过程的名称、过程使用的参数以及过程执行的操作。如果在应用程序中经常需要执行某些特定的操作,那么就可以基于这些操作创建一个特定的存储过程。存储过程经编译后存储在数据库中,所有执行存储过程要比执行存储过程中的封装的SQL语句更有效率。

    语法格式:创建存储过程

    1. CREATE [OR REPLACE] PROCEDURE 过程名(参数1 [IN|OUT|IN OUT] 数据类型,参数2 [IN|OUT|IN OUT] 数据类型……)
    2. IS|AS
    3. PL/SQL过程体;

    ① OR REPLACE:表示如果存储过程已经存在,则替换已有的存储过程
    ② IN表示传入参数,不可以被赋值,OUT表示传出参数,可以被赋值,IN OUT表示传入传出参数,可以传入值,可以被赋值,可以返回值。如果这部分省略,默认表示传入参数。创建函数可以带参数,也可以不带。
    ③ IS/AS:在IS/AS后声明变量不要加DECLARE语句

    命名规范:
    存储过程命名规范:SP目标表名
    存储过程传入参数命名规范:P
    参数名(PSTART_DATE)
    存储过程变量命名规范:V
    变量名(V_END_DATE)

    语法格式:调用存储过程

    1. BEGIN
    2. 过程名[(参数)];
    3. END;

    语法格式:删除存储过程

    1. DROP PROCEDURE 过程名;

    【例】查询20部门中的经理的姓名、工资、入职日期。

    1. -- 创建存储过程
    2. CREATE OR REPLACE PROCEDURE SP_MYEMP( P_DEPTNO IN NUMBER,
    3. P_HIREDATE OUT DATE,
    4. P_JOB_ENAME IN OUT VARCHAR2)
    5. IS
    6. ----------参数不能定义长度
    7. V_SAL NUMBER;
    8. BEGIN
    9. SELECT E.ENAME, E.SAL, E.HIREDATE
    10. INTO P_JOB_ENAME, V_SAL, P_HIREDATE
    11. FROM EMP E
    12. WHERE E.DEPTNO = P_DEPTNO
    13. AND E.JOB = P_JOB_ENAME;
    14. DBMS_OUTPUT.PUT_LINE(P_JOB_ENAME ||' '|| V_SAL ||' '|| P_HIREDATE);
    15. END;
    16. -- 调用存储过程
    17. DECLARE
    18. V_JOB_ENAME VARCHAR2(100):='MANAGER';
    19. V_HIREDATE DATE;
    20. BEGIN
    21. SP_MYEMP(20, V_HIREDATE, V_JOB_ENAME);
    22. END;