为什么在这里使用立即执行?

时间:2016-03-28 10:11:48

标签: oracle performance plsql dynamic-sql

我正在阅读expert-oracle-database-architecture book。汤姆正在解释关于绑定变量的内容。

请告诉我第一个程序与第二个程序有什么不同? 根据我的理解,我们使用execute immediate来执行动态SQL语句或匿名PL / SQL块。

这是目标表:

create table t ( x int ); 

以下是程序#1的示例:

ops$tkyte%ORA11GR2> create or replace procedure proc_name1
2 as
3 begin
4   for i in 1 .. 10
5     loop
6       execute immediate
7         'insert into t values ( '||i||')';
8   end loop;
9 end;
10 /

以下是程序#2的示例:

create or replace procedure proc_name2
 as
 begin
   for i in 1 .. 10
   loop
     insert into t values ( i);
   end loop;
 end;

1 个答案:

答案 0 :(得分:5)

  

“使用execute immediate会有什么好的表现吗?”

EXECUTE IMMEDIATE是不该做的。它的性能会更糟,因为它完成了非动态示例所做的所有事情,而且还有为循环的每次迭代硬解析语句的开销。

Tom的观点是,没有经验的开发人员在不需要时经常使用EXECUTE IMMEDIATE(或其他形式的动态SQL)。动态SQL是坏消息。除了性能影响:

  • 写入比静态SQL更难
  • 语法错误是运行时异常而不是编译错误
  • 维护起来比较困难(影响分析很棘手,因为依赖关系不会出现在数据字典视图中)。