DML RETURNING INTO
时间: 2025-01-04 16:23:27 浏览: 9
### DML RETURNING INTO 语句详解
#### 单行操作示例
对于单行的操作,`RETURNING INTO` 子句可以直接返回受影响的列值。下面是一个简单的例子,在 `UPDATE` 操作完成后立即获取被修改记录的新旧值:
```plsql
DECLARE
v_old_value VARCHAR2(10);
v_new_value VARCHAR2(10);
BEGIN
UPDATE employees SET salary = salary * 1.1 WHERE employee_id = 100
RETURNING first_name, last_name, old(salary), new(salary) INTO :v_old_value, :v_new_value;
END;
/
```
此代码片段展示了如何通过 `RETURNING INTO` 获取更新前后的特定字段值[^2]。
#### 多行操作处理
当涉及到多行时,则需要声明集合类型的变量来存储结果集中的每一项。例如,如果要批量删除某些员工并收集其ID列表作为反馈信息:
```plsql
DECLARE
TYPE t_ids IS TABLE OF NUMBER INDEX BY PLS_INTEGER;
l_deleted_ids t_ids;
BEGIN
DELETE FROM employees
WHERE department_id IN (SELECT deptno FROM departments WHERE location = 'New York')
RETURNING employee_id BULK COLLECT INTO l_deleted_ids;
FOR i IN l_deleted_ids.FIRST .. l_deleted_ids.LAST LOOP
DBMS_OUTPUT.PUT_LINE('Deleted Employee ID:' || TO_CHAR(l_deleted_ids(i)));
END LOOP;
END;
/
```
这段脚本说明了怎样利用数组结构保存由 `DELETE ... RETURNING` 返回的结果,并遍历打印出来[^5]。
需要注意的是,针对不同数据库产品可能存在细微差别。比如 PostgreSQL 支持更灵活的方式来进行此类操作;而 KunlunBase 对 MySQL 的扩展也提供了类似的特性但是存在一些局限性,如无法直接使用 `VALUES()` 函数而是采用 `EXCLUDED` 表达式替代[^4]。
阅读全文