设为首页 收藏本站
查看: 889|回复: 0

[经验分享] Oracle之绑定变量 2-11768293

[复制链接]

尚未签到

发表于 2018-9-7 12:02:24 | 显示全部楼层 |阅读模式
  绑定变量(bind variable)我们经常在写plsql中用到,那我们承接上一节的来看看在plsql中静态sql和动态sql在绑定变量的区别
declare  
    v_value_a varchar2(100);
  
    v_value_b varchar2(100);
  
    v_name  varchar2(50);
  
begin
  
    v_value_a := 'SMITH';
  
    select e.ename/*+test*/into v_name from scott.emp e where e.ename = v_value_a;
  
    v_value_b := 'ALLEN';
  
    select e.ename/*+test*/into v_name from scott.emp e where e.ename = v_value_b;
  
end;
  
/
  查询v$sql
select * from v$sql d where d.SQL_TEXT like '%/*+test*/%';
DSC0000.png

  这里看到只产生了一条sql_id,oracle会自动把变量v_value_a,v_value_b换成绑定变量:B1.
  再来看看动态sql
PLSQL_1:  
declare
  
    v_value_a varchar2(100);
  
    v_value_b varchar2(100);
  
    v_name  varchar2(50);
  
begin
  
    v_value_a := 'SMITH';
  

  
    v_value_b := 'ALLEN';
  

  
    execute immediate 'select e.ename/*+sql*/ from scott.emp e where e.ename = :xxx'
  
    using v_value_a;
  

  
    execute immediate 'select e.ename/*+sql*/ from scott.emp e where e.ename = :yyy'
  
    using v_value_b;
  
end;
  
/
  查询v$sql
select * from v$sql d where d.SQL_TEXT like '%/*+sql*/%';
DSC0001.png

  这里可以看到动态sql就是以执行sql为文本进行解析的,如果两个sql有不同就是不同的sql语句。
  2.获取绑定变量的值
  那我们可以得到绑定的变量的值吗?通过v$sql_bind_capture就可以查询到
SQL_1:  
select d.NAME, d.POSITION, d.SQL_ID, value_string
  
  from v$sql_bind_capture d
  
where d.SQL_ID in
  
       (select sql_id from v$sql v where v.SQL_TEXT like '%/*+sql*/%')
DSC0002.png

  这时我们看到绑定变量的值是上文看到的v_value_a和v_value_b的值。
  接着往下走,改变v_value_a的值:
v_value_a := 'CLARK';  执行PLSQL_1,SQL_1
DSC0003.png

  绑定变量的值并没有发生变化,这时为什么呢?

  •   v$sql_bind_capture这个视图是一个快照视图,并不会保存所有执行过的SQL的绑定变量,只会记录最近一次捕获到的绑定值,而已每次捕获都是有间隔时间的。ORACLE为我们提供了一个隐含参数_cursor_bind_capture_interval(默认900s),这个就是控制绑定变量抓取频率的参数。
  •   如果绑定变量是DATE类型则无法直接查看到的。



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-566034-1-1.html 上篇帖子: oracle之sql查询二 下篇帖子: LInux 安装Oracle数据库
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

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