这里为什么要用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
- 语法错误是运行时异常而不是编译错误
- 更难维护(影响分析很棘手,因为依赖关系不会出现在数据字典视图中)。
我正在阅读 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
- 语法错误是运行时异常而不是编译错误
- 更难维护(影响分析很棘手,因为依赖关系不会出现在数据字典视图中)。