1. FAQ:
question | answer | 备注 |
SQL中用过的绑定变量是否可查 | 可查部分绑定变量(非最新,仅其中某时刻的值) | 测试版本:Oracle 11g |
绑定变量可存储多久 | 内存中的存在时长较短由Oracle维护。 AWR中的存在时长一般为7天由Oracle维护 | 测试版本:Oracle 11g |
绑定变量可存储多少个 | 存储近期的1个,但不一定是第一个或最后一个 | 测试版本:Oracle 11g |
2. Oracle查看绑定变量的几种方法
(1) 10046
(2) v$sql(该视图的bind_data列需要用dbms_sqltune.extract_bind(bind_data,N).value_string进行解析)
(3) v$sql_bind_capture
(4) DBA_SQLSET_BINDS(displays the bind values associated with all SQL tuning sets in the database)
(5) AWR
① DBA_HIST_SQLSTAT
② DBS_HIST_SQLBIND
3. Oracle绑定变量的相关规则
(1) 当SQL执行硬解析时绑定变量值被捕获,并可从视图v$sql_bind_capture/v$sql中查询。
(2) 对于执行软解析/软软解析的SQL,默认情况下间隔15分钟才会刷新被捕获的值(受隐藏参数_cursor_bind_capture_interval控制)
(3) Oracle 19c测试中隐藏参数_cursor_bind_capture_interval不再生效
4. 相关文章
(1) 如何得到SQL中的绑定变量值
https://kdocs.cn/l/cfEKCbbUOG9Q
5. 相关SQL
--设置并使用变量
variable task_name varchar2(255);
execute :task_name := 'KING';
select * from zzt.emp where ename = :task_name;
--查看SQL_ID
select * from v$sql s where s.SQL_TEXT like 'select * from zzt.emp where ename = :task_name%';
--查看当前时间
select systimestamp from dual;
--查看绑定变量:内存中
select * from v$sql_bind_capture c where c.sql_id='dru9tbgw9vuux';
select dbms_sqltune.extract_bind(bind_data,1).value_string,s.* from v$sql s where s.sql_id='dru9tbgw9vuux';
--查看绑定变量:AWR中(但需要满足AWR捕获条件才行)
select * from dba_hist_sqlbind where sql_id='dru9tbgw9vuux';
select * from dba_sqlset_binds where sql_id='dru9tbgw9vuux';
6. 测试案例
--设置sqlplus
set line 150
set pages 200
col sql_id for a20
col name for a10
col was_captured for a10
col sysdate for a20
col last_captured for a20
col value_string for a10
--修改系统参数
alter system set "_cursor_bind_capture_interval"=5 scope=both;
--设置并使用变量
variable task_name varchar2(255);
execute :task_name := 'KING';
select * from zzt.emp where ename = :task_name;
--查看绑定变量:内存中
select sql_id,name,was_captured,sysdate,last_captured,value_string
from v$sql_bind_capture c where c.sql_id='dru9tbgw9vuux';
--设置并使用变量
variable task_name varchar2(255);
execute :task_name := 'SCOTT';
select * from zzt.emp where ename = :task_name;
--查看绑定变量:内存中
select sql_id,name,was_captured,sysdate,last_captured,value_string
from v$sql_bind_capture c where c.sql_id='dru9tbgw9vuux';
end