oracle的动态sql变量绑定,Oracle之绑定变量 2

绑定变量(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$sqlselect * from v$sql d where d.SQL_TEXT like '%/*+test*/%';

e7054a2645d696c263a388dd7cb24b2a.png

这里看到只产生了一条sql_id,oracle会自动把变量v_value_a,v_value_b换成绑定变量:B1.

再来看看动态sqlPLSQL_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$sqlselect * from v$sql d where d.SQL_TEXT like '%/*+sql*/%';

8f87b471275eda6c9b3c2a2f7c5ce74e.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*/%')

8f71de57a7ceaada36f4f33a6f764014.png

这时我们看到绑定变量的值是上文看到的v_value_a和v_value_b的值。

接着往下走,改变v_value_a的值:v_value_a := 'CLARK';

执行PLSQL_1,SQL_1

a461a27af88b7cc257abe7a16f10298b.png

绑定变量的值并没有发生变化,这时为什么呢?v$sql_bind_capture这个视图是一个快照视图,并不会保存所有执行过的SQL的绑定变量,只会记录最近一次捕获到的绑定值,而已每次捕获都是有间隔时间的。ORACLE为我们提供了一个隐含参数_cursor_bind_capture_interval(默认900s),这个就是控制绑定变量抓取频率的参数。

如果绑定变量是DATE类型则无法直接查看到的。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值