甲骨文之绑定变量2

  

绑定变量(<强> )我们经常在写plsql中用的到,那我们承接上一节的来看看在plsql中静态sql和动态sql在绑定变量的区别

申报的东西   ,,,v_value_a  varchar2 (100);   ,,,v_value_b  varchar2 (100);   ,,,v_name , varchar2 (50);   开始   ,,,v_value_a :=,“史密斯”;   ,,,select  e.ename/* +测试*/into  v_name 得到scott.emp  e  where  e.ename =, v_value_a;   ,,,v_value_b :=,“艾伦”;   ,,,select  e.ename/* +测试*/into  v_name 得到scott.emp  e  where  e.ename =, v_value_b;   结束;/

查询v $ sql

select  *,得到v $ sql  d  where  d.SQL_TEXT  like  %/* +测试*/%的;

凹坠俏闹蠖ū淞?

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


再来看看动态sql

PLSQL_1:   声明   ,,,v_value_a  varchar2 (100);   ,,,v_value_b  varchar2 (100);   ,,,v_name , varchar2 (50);   开始   ,,,v_value_a :=,“史密斯”;   ,,,,   ,,,v_value_b :=,“艾伦”;      ,,,execute  immediate “select  e.ename sql *//* +,得到scott.emp  e  where  e.ename =,: xxx”,   ,,,using  v_value_a;   ,,,,   ,,,execute  immediate “select  e.ename sql *//* +,得到scott.emp  e  where  e.ename =,:多”,   ,,,using  v_value_b;   结束;/

查询v $ sql

select  *,得到v $ sql  d  where  d.SQL_TEXT  like  %/* + sql */%的;

凹坠俏闹蠖ū淞?

这里可以看到动态sql就是以执行sql为文本进行解析的,如果两个sql有不同就是不同的sql语句。


2。获取绑定变量的值

那我们可以得到绑定的变量的值吗?通过<强> v $ sql_bind_capture 强就可以查询到

SQL_1:   select  d.NAME, d.POSITION, d.SQL_ID, value_string   得到才能v $ sql_bind_capture  d   where  d.SQL_ID 在   ,,,,,,(select  sql_id 得到v $ sql  v  where  v.SQL_TEXT  like ‘%/* + sql */%)

凹坠俏闹蠖ū淞?

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

接着往下走,改变v_value_a的值:

v_value_a :=,“克拉克”;

执行PLSQL_1, SQL_1

凹坠俏闹蠖ū淞?

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

<李>

<强> v $ sql_bind_capture 这个视图是一个快照视图,并不会保存所有执行过的sql的绑定变量,只会记录最近一次捕获到的绑定值,而已每次捕获都是有间隔时间的.ORACLE为我们提供了一个隐含参数<强> _cursor_bind_capture_interval(默认900年代)强劲,这个就是控制绑定变量抓取频率的参数。

<李>

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


甲骨文之绑定变量2