欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

sql语句绑定变量及afterlogondatabase触发器的影响

程序员文章站 2022-04-15 12:51:51
sql语句绑定变量及afterlogondatabase触发器的影响。手记一: 背景:今日有个DBA的同事和我说一个关于sql语句写法导致硬解释的case ,特滋记录 过程: 当c...

sql语句绑定变量及afterlogondatabase触发器的影响。手记一: 背景:今日有个DBA的同事和我说一个关于sql语句写法导致硬解释的case ,特滋记录 过程: 当cursor_sharing=force 时,如下sql语句是不会重用执用执行计划的: SQL1: select name --不需要显示全部字段 from author where id=1;

SQL2: select name --不需要显示全部字段 from author where id=2; SQL1和SQL2不能共享执行计划,原因是触发了oracle的 bug:Bug 9488694 : QUERY USING A SUBQUERY FACTORING CLAUSE SHOWS A DIFFERENT SIGNATURE. 验证:select sql_text,force_matching_signature from v$sqlarea where sql_text like '%不需要显示全部字段%' 返回的:,force_matching_signature 结果不一致。

CASE2: 当cursor_sharing=force 时,如下sql语句是不会重用执用执行计划的: SQL1: select name from author where id=1;

SQL2: select name from author where id=2; 没有注释的情况下,同样的语句是能共享解释计划的。

CASE3: 当cursor_sharing=force 时,当使用显示绑定变量的方式,不管是否存在注释都能共享执行计划,也就是说软解释。 declare v_sql varchar2(300); v_id varchar2(300); v_full_name varchar2(300); begin v_sql:='--aa '||chr(10)||'select /*+ qqt */full_name from author where id=:1'; v_dealer_no:='333924378'; execute immediate v_sql into v_full_name using v_id ; DBMS_OUTPUT.PUT_LINE(v_full_name); end; /