为啥这里使用立即执行?
Posted
技术标签:
【中文标题】为啥这里使用立即执行?【英文标题】:Why execute immediate is used here?为什么这里使用立即执行? 【发布时间】:2016-03-28 10:11:48 【问题描述】:我正在阅读专家-oracle-database-architecture 书籍。在这个 Tom 正在解释绑定变量。
你能告诉我第一个程序和第二个程序有什么不同吗?
据我了解,我们使用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;
【问题讨论】:
这是一个不该做的例子 所以除了他们写的方式之外,两者没有区别。使用立即执行会有什么好的表现吗? 这是execute immediate
语句的(ab)使用。另外,严格来说,根本不需要那个简单的插入过程,你可以简单地用纯 SQL 来完成。
您应该阅读周围的文字以获取更多信息。 Tom 告诉你有多少开发人员使用 EXECUTE IMMEDIATE
进行动态 SQL 却没有意识到它是如何影响性能的,尤其是由于每次循环迭代都对语句进行了硬解析
假设您在设计时不知道表名t
,由于某种原因,您必须在循环中而不是单个插入语句中执行此操作。在这种情况下,声明会更好,如execute immediate 'insert into t values (:val)' USING i
【参考方案1】:
“使用立即执行会有什么好的表现吗?”
立即执行是不应该做的。它的性能会更差,因为它完成了非动态示例所做的所有事情,而且每次循环迭代都会产生硬解析语句的开销。
Tom 的意思是,没有经验的开发人员经常在不需要时使用 EXECUTE IMMEDIATE(或其他形式的动态 SQL)。动态 SQL 是个坏消息。除了性能影响:
比静态 SQL 更难写 语法错误是运行时异常而不是编译错误 更难维护(影响分析很棘手,因为依赖项不会出现在数据字典视图中)。【讨论】:
以上是关于为啥这里使用立即执行?的主要内容,如果未能解决你的问题,请参考以下文章
为啥会出现“ORA-00933:SQL 命令未正确结束”错误(立即执行)?
为啥使用 system() 的 return-to-libc shell 会立即退出?