RETURNING INTO 子句 (PL/SQL)

数据服务器能够对追加了可选的 RETURNING INTO 子句的 INSERT、UPDATE 和 DELETE 语句进行编译。在 PL/SQL 上下文中使用此子句时,它将捕获分别通过执行 INSERT、UPDATE 或 DELETE 语句新添加、修改或删除的值。

语法

阅读语法图跳过直观语法图insert-statementupdate-statementdelete-statementRETURNING *,表达式 INTO 记录,字段

描述

INSERT 语句
指定有效的 INSERT 语句。如果此 INSERT 语句返回包含多行的结果集,那么将发生异常。
UPDATE 语句
指定有效的 UPDATE 语句。如果此 UPDATE 语句返回包含多行的结果集,那么将发生异常。
DELETE 语句
指定有效的 DELETE 语句。如果此 DELETE 语句返回包含多行的结果集,那么将发生异常。
RETURNING *
指定受 INSERT、UPDATE 或 DELETE 语句影响的行中所有的值都可用于赋值。
RETURNING 表达式
指定要针对 INSERT、UPDATE 或 DELETE 语句所影响的行进行求值的表达式。求值结果将被指定给指定的记录或字段。
INTO 记录
指定将返回的值存储到具有兼容的字段和数据类型的记录中。这些字段在数目、顺序和数据类型方面必须与 RETURNING 子句所指定的那些值匹配。如果结果集未包含任何行,那么记录中的字段将被设置为 null 值。
INTO 字段
指定将返回的值存储到一组具有兼容的字段和数据类型的变量中。这些字段在数目、顺序和数据类型方面必须与 RETURNING 子句所指定的那些值匹配。如果结果集未包含任何行,那么这些字段将被设置为 null 值。

示例

以下示例演示一个使用了 RETURNING INTO 子句的过程:
CREATE OR REPLACE PROCEDURE emp_comp_update (
    p_empno         IN emp.empno%TYPE,
    p_sal           IN emp.sal%TYPE,
    p_comm          IN emp.comm%TYPE
)
IS
    v_empno         emp.empno%TYPE;
    v_ename         emp.ename%TYPE;
    v_job           emp.job%TYPE;
    v_sal           emp.sal%TYPE;
    v_comm          emp.comm%TYPE;
    v_deptno        emp.deptno%TYPE;
BEGIN      
    UPDATE emp SET sal = p_sal, comm = p_comm WHERE empno = p_empno
    RETURNING
        empno,
        ename,
        job,
        sal,
        comm,
        deptno
    INTO
        v_empno,
        v_ename,
        v_job,
        v_sal,
        v_comm,
        v_deptno;

    IF SQL%FOUND THEN
        DBMS_OUTPUT.PUT_LINE('Updated Employee # : ' || v_empno);
        DBMS_OUTPUT.PUT_LINE('Name               : ' || v_ename);
        DBMS_OUTPUT.PUT_LINE('Job                : ' || v_job);
        DBMS_OUTPUT.PUT_LINE('Department         : ' || v_deptno);
        DBMS_OUTPUT.PUT_LINE('New Salary         : ' || v_sal);
        DBMS_OUTPUT.PUT_LINE('New Commission     : ' || v_comm);
    ELSE          
        DBMS_OUTPUT.PUT_LINE('Employee # ' || p_empno || ' not found');
    END IF;      
END;
此过程返回以下样本输出:

EXEC emp_comp_update(9503, 6540, 1200);

Updated Employee # : 9503
Name               : PETERSON
Job                : ANALYST
Department         : 40
New Salary         : 6540.00
New Commission     : 1200.00
以下示例演示一个使用了带有记录类型的 RETURNING INTO 子句的过程:
CREATE OR REPLACE PROCEDURE emp_delete (
    p_empno         IN emp.empno%TYPE
)
IS
    r_emp           emp%ROWTYPE;
BEGIN      
    DELETE FROM emp WHERE empno = p_empno
    RETURNING
        *
    INTO
        r_emp;

    IF SQL%FOUND THEN
        DBMS_OUTPUT.PUT_LINE('Deleted Employee # : ' || r_emp.empno);
        DBMS_OUTPUT.PUT_LINE('Name               : ' || r_emp.ename);
        DBMS_OUTPUT.PUT_LINE('Job                : ' || r_emp.job);
        DBMS_OUTPUT.PUT_LINE('Manager            : ' || r_emp.mgr);
        DBMS_OUTPUT.PUT_LINE('Hire Date          : ' || r_emp.hiredate);
        DBMS_OUTPUT.PUT_LINE('Salary             : ' || r_emp.sal);
        DBMS_OUTPUT.PUT_LINE('Commission         : ' || r_emp.comm);
        DBMS_OUTPUT.PUT_LINE('Department         : ' || r_emp.deptno);
    ELSE          
        DBMS_OUTPUT.PUT_LINE('Employee # ' || p_empno || ' not found');
    END IF;      
END;
此过程返回以下样本输出:

EXEC emp_delete(9503);

Deleted Employee # : 9503
Name               : PETERSON
Job                : ANALYST
Manager            : 7902
Hire Date          : 31-MAR-05 00:00:00
Salary             : 6540.00
Commission         : 1200.00
Department         : 40