声明部分中指定的PROCEDURE子句用于定义和命名该块本地的子存储过程。
术语块指 SPL 块结构,该结构由可选的声明部分、必需的可执行部分和可选的异常部分组成。块是独立存储过程和函数、匿名块、子程序、触发器、包和对象类型方法的结构。
短语标识符是块本地的意味着标识符(例如变量、游标、类型或子程序)在该块的声明部分中声明,因此可由 SPL 代码在该块的可执行部分和可选异常部分中进行访问。
子存储过程只能在声明部分中包括所有其他变量、游标和类型后声明。
PROCEDURE name [ (parameters) ]{ IS | AS }
[ PRAGMA AUTONOMOUS_TRANSACTION; ]
[ declarations ]
BEGIN
statements
END [ name ];
参数
参数 | 说明 |
---|---|
name | name是子存储过程的标识符。 |
parameters | parameters是形参的列表。 |
PRAGMA AUTONOMOUS_TRANSACTION | PRAGMA AUTONOMOUS_TRANSACTION是将子存储过程设置为自治事务的指令。 |
declarations | declarations是变量、游标、类型或子程序声明。如果包括子程序声明,则它们必须在所有其他变量、游标和类型声明之后。 |
statements | statements是SPL程序语句(BEGIN - END块可以包含EXCEPTION部分)。 |
示例
以下示例是匿名块中的一个子存储过程。
DECLARE
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('Subprocedure list_emp:');
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;
BEGIN
list_emp;
END;
调用此匿名块会产生以下输出:
Subprocedure list_emp:
EMPNO ENAME
----- -------
7369 SMITH
7499 ALLEN
7521 WARD
7566 JONES
7654 MARTIN
7698 BLAKE
7782 CLARK
7788 SCOTT
7839 KING
7844 TURNER
7876 ADAMS
7900 JAMES
7902 FORD
7934 MILLER
以下示例是触发器中的一个子存储过程。
CREATE OR REPLACE TRIGGER dept_audit_trig
AFTER INSERT OR UPDATE OR DELETE ON dept
DECLARE
v_action VARCHAR2(24);
PROCEDURE display_action (
p_action IN VARCHAR2
)
IS
BEGIN
DBMS_OUTPUT.PUT_LINE('User ' || USER || ' ' || p_action ||
' dept on ' || TO_CHAR(SYSDATE,'YYYY-MM-DD'));
END display_action;
BEGIN
IF INSERTING THEN
v_action := 'added';
ELSIF UPDATING THEN
v_action := 'updated';
ELSIF DELETING THEN
v_action := 'deleted';
END IF;
display_action(v_action);
END;
调用此触发会产生以下输出:
INSERT INTO dept VALUES (50,'HR','DENVER');
User polardb added dept on 2016-07-26