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