暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle中如何查看SQL的绑定变量

原创 张文林 2023-09-15
1071

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

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论