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; /