重庆思庄Oracle、Redhat认证学习论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3140|回复: 0
打印 上一主题 下一主题

[范例] 如何提取sql语句中绑定变量的值?

[复制链接]
跳转到指定楼层
楼主
发表于 2016-9-15 11:54:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们在处理sql语句性能问题时,很多时候,提取到的sql语句带了绑定变量的,不能直接拿来运行,如下的sql语句,直接执行,会报变量没有赋值之类的错误.

SELECT A.RECIPE_ID
FROM CIS_OPD_CLINIC A, TABLE(xxx.STR2LIST(:B1 )) B
WHERE A.RECIPE_ID = B.COLUMN_VALUE
       OR A.PARENTID = B.COLUMN_VALUE
ORA-01008: 并非所有变量都绑定.

那么这个B1 具体是什么值呢?

马上查询v$sqlarea中的sql_id

SQL>  SELECT sql_id, child_number , sql_text FROM v$sql WHERE  upper(sql_text) Like '%SELECT A.RECIPE_ID FROM CIS_OPD_CLINIC A, TABLE(xxx.STR2LIST(:B1 )) B WHERE A.RECIPE_ID = B.COLUMN_VALUE OR A.PARENTID = B.COLUMN_VALUE%'
  2  ;
SQL_ID        CHILD_NUMBER SQL_TEXT
------------- ------------ --------------------------------------------------------------------------------
cn2c9mf5f9xda            0 SELECT sql_id, child_number , sql_text FROM v$sql WHERE  upper(sql_text) Like '%
07zdmp13w1zw6            0 SELECT A.RECIPE_ID FROM CIS_OPD_CLINIC A, TABLE(ZLBASE.STR2LIST(:B1 )) B WHERE A
07zdmp13w1zw6            1 SELECT A.RECIPE_ID FROM CIS_OPD_CLINIC A, TABLE(ZLBASE.STR2LIST(:B1 )) B WHERE A
07zdmp13w1zw6            2 SELECT A.RECIPE_ID FROM CIS_OPD_CLINIC A, TABLE(ZLBASE.STR2LIST(:B1 )) B WHERE A
07zdmp13w1zw6            3 SELECT A.RECIPE_ID FROM CIS_OPD_CLINIC A, TABLE(ZLBASE.STR2LIST(:B1 )) B WHERE A
3akum7jd5b8j5            0   SELECT sql_id, child_number , sql_text FROM v$sql WHERE  upper(sql_text) Like
bjvppgp4jrfh8            0  SELECT sql_id, child_number , sql_text FROM v$sql WHERE  upper(sql_text) Like '
2na7kxsh0msa6            0 select sql_id, address, hash_value, executions, loads, parse_calls, invalidation
8 rows selected

通过以下sql语句察看
  SELECT name ,position,datatype_string,was_captured,value_string
    FROM   v$sql_bind_capture
    WHERE  sql_id = '&SQLID';

SQL> SELECT name ,position,datatype_string,was_captured,value_string
  2      FROM   v$sql_bind_capture
  3      WHERE  sql_id = '&SQLID';
输入: 07zdmp13w1zw6
SQL>
NAME                                                           POSITION DATATYPE_STRING                WAS_CAPTURED VALUE_STRING
------------------------------------------------------------ ---------- ------------------------------ ------------ --------------------------------------------------------------------------------
:B1                                                                   1 VARCHAR2(2000)                 NO           
:B1                                                                   1 VARCHAR2(2000)                 NO           
:B1                                                                   1 VARCHAR2(128)                  NO           
:B1                                                                   1 VARCHAR2(128)                  NO

这样,我们就已经找到:B1的值,代入原sql中,就可以正常执行了.


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 支持支持 反对反对
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|重庆思庄Oracle、Redhat认证学习论坛 ( 渝ICP备12004239号-4 )

GMT+8, 2024-4-25 14:35 , Processed in 0.106385 second(s), 20 queries .

重庆思庄学习中心论坛-重庆思庄科技有限公司论坛

© 2001-2020

快速回复 返回顶部 返回列表