select from update row的实现

来源:互联网 发布:淘宝云盘在哪里 编辑:程序博客网 时间:2024/06/16 03:28

DTCC大会上,阿里江疑的演讲中提到一个:select from update hot row;

不明白如何在Oracle中实现的,他的意思是在一条SQL中实现update和select这条update的字段信息。

经dbsnake指点,了解到这是模仿了Oracle的returning into子句,可以将使用的DML语句影响的行记录的指定列的值select出来。


官方文档中有示例:

http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/tuning.htm

You can use the BULK COLLECT clause in the RETURNING INTO clause of an INSERTUPDATE, or DELETE statement:

Example 11-15 Using BULK COLLECT With the RETURNING INTO Clause

CREATE TABLE emp_temp AS SELECT * FROM employees;DECLARE   TYPE NumList IS TABLE OF employees.employee_id%TYPE;   enums NumList;   TYPE NameList IS TABLE OF employees.last_name%TYPE;   names NameList;BEGIN   DELETE FROM emp_temp WHERE department_id = 30      RETURNING employee_id, last_name BULK COLLECT INTO enums, names;   DBMS_OUTPUT.PUT_LINE('Deleted ' || SQL%ROWCOUNT || ' rows:');   FOR i IN enums.FIRST .. enums.LAST   LOOP      DBMS_OUTPUT.PUT_LINE('Employee #' || enums(i) || ': ' || names(i));   END LOOP;END;/
注意:需要在sqlplus中执行set serveroutput on子句


上面例子对于不熟悉PLSQL的不是很好理解,用一个简单的示例说明:

1. 创建测试表:

[sql] view plaincopy
  1. <span style="font-family:Microsoft YaHei;font-size:14px;">create table tbl_returninto(  
  2. id number,  
  3. remark varchar2(5));</span>  

[sql] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <span style="font-family:Microsoft YaHei;font-size:14px;">SQL> select * from tbl_returninto;  
  2.     ID REMARK  
  3. ---------- --------------------------------------------------  
  4.      2 one  
  5.      3 two  
  6.      4 three  
  7. </span>  

2. 插入一条记录,使用returning into在同一条SQL中获得插入的id值:

[sql] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <span style="font-family:Microsoft YaHei;font-size:14px;">SQL> declare  
  2.   2  l_id tbl_returninto.id%type;  
  3.   3  begin  
  4.   4  insert into tbl_returninto values(tr_seq.nextval, 'one')  
  5.   5  returning id into l_id;  
  6.   6  commit;  
  7.   7  dbms_output.put_line('id=' || l_id);  
  8.   8  end;  
  9.   9  /  
  10. id=1  
  11.   
  12. PL/SQL procedure successfully completed.</span>  


3. 更新和删除一条记录,使用returning into获得更新和删除的id值:

[sql] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <span style="font-family:Microsoft YaHei;font-size:14px;">SQL> declare l_id tbl_returninto.id%type;  
  2.   2  begin  
  3.   3  update tbl_returninto  
  4.   4  set remark = 'one2'  
  5.   5  where id = 2  
  6.   6  returning id into l_id;  
  7.   7  dbms_output.put_line('UPDATE ID=' || l_id);  
  8.   8  delete from tbl_returninto where remark = 'three'  
  9.   9  returning id into l_id;  
  10.  10  dbms_output.put_line('DELETE ID=' || l_id);  
  11.  11  commit;  
  12.  12  end;  
  13.  13  /  
  14. UPDATE ID=2  
  15. DELETE ID=4  
  16.   
  17. PL/SQL procedure successfully completed.</span>  

总结

使用returning into子句可以在一条SQL中将insert、update和delete影响的行记录指定字段信息select出来,其中insert和update都是执行之后的结果,delete是执行之前的结果。当然,其实这里用的是PLSQL的语法实现。

0 0
原创粉丝点击