这里为什么要用execute immediate呢?

Why execute immediate is used here?

我正在阅读 oracle-database-architecture 专家书籍。在此 Tom 正在解释绑定变量。

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

这里是目标 table:

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;

"Will there be any good performance using execute immediate? "

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

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

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