为啥这里使用立即执行?

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 会立即退出?

为啥 appcenter 分析没有立即显示跟踪来自 android 应用程序的事件?

为啥粉碎后没有立即出现“检测到堆栈粉碎”?

为啥 requestLocationUpdates 会在接收时立即触发?