ITPUB??ì3
ITPUB论坛 » Oracle专题深入讨论 » 从v$sqlarea视图中怎么查看sql是否使用了绑定变量?

标题: [原创] 从v$sqlarea视图中怎么查看sql是否使用了绑定变量?
离线 javaliu2006



精华贴数 0
个人空间 0
技术积分 462 (4132)
社区积分 4 (18859)
注册日期 2008-3-21
论坛徽章:0
      
      

发表于 2008-6-11 11:10 
从v$sqlarea视图中怎么查看sql是否使用了绑定变量?

从v$sqlarea视图中怎么查看sql是否使用了绑定变量?

解析后的SQL与解析前的SQL,在形式上有什么区别?

普通变量与绑定变量在解析之后有什么区别,怎么区分?

谢谢!


只看该作者    顶部
离线 javaliu2006



精华贴数 0
个人空间 0
技术积分 462 (4132)
社区积分 4 (18859)
注册日期 2008-3-21
论坛徽章:0
      
      

发表于 2008-6-11 12:59 
从v$sqlarea视图中怎么查看sql是否使用了绑定变量?
解析后的SQL与解析前的SQL,在形式上有什么区别?
普通变量与绑定变量在解析之后有什么区别,怎么区分?
如:
SELECT ROWNUM            NUM,
       M.MANAGED_PORT_ID PORTID,
       M.CODE            PORTCODE,
       E.EQUIPMENT_ID    EQUID,
       E.CODE            EQUCODE,
       B.CODE            HLCODE
  FROM CONNECTOR C,
       MANAGED_PORT M,
       EQUIPMENT E,
       DEVICE_SIDE_PORT B,
       (SELECT S.SIDE_ID SS
          FROM SIDE S,
               (SELECT A.NODE_ID AA, B.NODE_ID BB
                  FROM NODE A, NODE B
                 WHERE A.DEVICE_ID = :1
                   AND B.DEVICE_ID = :2) AA
         WHERE S.NODE_ID_A = AA.AA
           AND S.NODE_ID_B = AA.BB) SS
WHERE C.SIDE_ID = SS.SS
   AND C.SIDEA_PORT_ID = M.MANAGED_PORT_ID
   AND M.RSC_STATUS_CD = :"SYS_B_0"
   AND C.SIDEB_PORT_ID = B.PORT_ID
   AND E.EQUIPMENT_ID = M.EQUIPMENT_ID
   AND M.CODE LIKE :"SYS_B_1"
   AND M.RSC_SPEC_ID IN (:3)
   AND C.RSC_STATUS_CD = :"SYS_B_2"
   AND ROWNUM > :4
   AND ROWNUM < :5
ORDER BY M.CODE, PORTID;

如上SQL中,:"SYS_B_0",:"SYS_B_1",:"SYS_B_2" 与 :4,:5 这几个变量哪些用的是绑定变理?怎么区分?

还有一个问题就是,SQL 中写死的常量,解析后,常量前会加“:”吗?,例如:解析前的SQL为:
select * from area where area_id=13101,解析后,是与前析前一样,还是会变成:select * from area where area_id=:13101 ,即在常量前加“:” ?

谢谢!


只看该作者    顶部
离线 liqy103
一般会员


精华贴数 0
个人空间 0
技术积分 274 (7019)
社区积分 2 (27963)
注册日期 2006-1-22
论坛徽章:0
      
      

发表于 2008-6-11 13:39 
有:的就是变量


只看该作者    顶部
离线 nganhong
初级会员



精华贴数 0
个人空间 0
技术积分 46 (29320)
社区积分 0 (1281459)
注册日期 2007-2-26
论坛徽章:0
      
      

发表于 2008-6-13 09:02 
如果看到這樣的綑綁變數,

:"SYS_B_0"
:"SYS_B_1"
:"SYS_B_2"
:"SYS_B_3"

該 sql 陳述原來應是 literal 字串但已經過 oracle parser 轉換

至於原來的值 可能要在原始碼中才能找出

當 cursor_sharing 是 similar 或者 force 時  才會改變 parser 成為這樣的行為


只看该作者    顶部
离线 Yong Huang
版主



精华贴数 2
个人空间 0
技术积分 3994 (347)
社区积分 120 (3015)
注册日期 2001-10-9
论坛徽章:6
现任管理团队成员ITPUB元老管理团队2006纪念徽章会员2006贡献徽章授权会员2008年新春纪念徽章
      

发表于 2008-6-15 06:38 
There're many forms of bind variable notation for mid-tier apps, :[number], :P[number], :B[number], :v[number], etc, and of course :[word]. I think the :P[number] form is for Perl DBI. But other forms vary (Try select module, parsing_schema_name, sql_text from v$sql where parsing_schema_id != 0 and sql_text like '%:%' and see if you can find a pattern.) The number is sequentially assigned, not changing, e.g., 13101 to :13101. You can't have that many bind variables in one SQL statement!

The :"SYS_B_[number]" notation is for Oracle-converted bind variables, as nganhong said.

Original runtime values can be found in app tier source code, or v$sql_bind_capture in 10g (subject to a lot of limitations), or through 10046 event trace.

Obviously not all SQLs having a colon (:) are using bind variables, for instance, select * from emp where trunc(hiredate) = '20080101 00:00:00', or select * from document where text like '%He said:%'. Conversely, a SQL using bind variables must have a colon in it, although it can still have literal values: select * from emp where name=:1 and dept=123.

Yong Huang


只看该作者    顶部
离线 javaliu2006



精华贴数 0
个人空间 0
技术积分 462 (4132)
社区积分 4 (18859)
注册日期 2008-3-21
论坛徽章:0
      
      

发表于 2008-6-16 09:42 
谢谢版主的回答!


只看该作者    顶部
 
    

相关内容


CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问