之前有一个朋友给我说,他在数据库中找出来的sql就是有绑定变量的,没有具体的参数值。这里记录一下:
首先用session 1来跟新一行,不提交:
SQL> update test set name='李四' where id=2 and name='张三';
已更新 1 行。
下面用session 2来更新同一行,这样就会阻塞:
SQL> select sid from v$mystat where rownum=1;
SID
----------
19
SQL> variable v_id number;
SQL> variable v_name varchar2(10);
SQL> exec :v_id := 2;
PL/SQL 过程已成功完成。
SQL> exec :v_name :='张三';
PL/SQL 过程已成功完成。
SQL> update test set name='李四' where id=:v_id and name=:v_name;
在session 3 中来查看session 2 的sql 的绑定变量值:
SQL> select t.SID,t.BLOCKING_SESSION,t.STATUS,t.EVENT,t.SQL_ID from v$session t where sid=19;
SID BLOCKING_SESSION STATUS EVENT SQL_ID
---------- ---------------- -------- -------------------------------------------------- -------------
19 10 ACTIVE enq: TX - row lock contention 02pf8u9yxqy25
SQL> select sql_text from v$sqlarea where sql_id = '02pf8u9yxqy25';
SQL_TEXT
--------------------------------------------------------------------------------
update test set name='李四' where id=:v_id and name=:v_name
SQL> select name,value_string from v$sql_bind_capture where sql_id = '02pf8u9yxqy25';
NAME VALUE_STRING
------------------------------------------------------------ ---------------
:V_ID 2
:V_NAME 张三