当前位置: 首页 > 面试题库 >

为什么PL / pgSQL函数会有副作用,而SQL函数却没有?

文心思
2023-03-14
问题内容

PostgreSQL文件说:

SQL函数的整个主体在执行任何函数之前都会被解析。 虽然SQL函数可以包含 更改系统目录的命令 (例如CREATE TABLE),但是在对函数中的后续命令进行语法分析时,这些命令的效果将不可见。因此,例如, CREATE TABLE foo (...); INSERT INTO foo VALUES(...); 如果打包到单个SQL函数中将无法按预期工作
,因为INSERT解析命令时foo尚不存在。

在这种情况下,建议使用PL / pgSQL代替SQL函数。

  • 为什么“在这种情况下,建议使用PL / pgSQL代替SQL函数”,而PL / pgSQL或SQL函数包含更改系统目录的命令,例如CREATE TABLE foo (...); INSERT INTO foo VALUES(...);

  • “ SQL函数的整个主体在执行任何函数之前都会被解析”。PL / pgSQL函数不是真的吗?在解析和执行其主体中的命令方面,SQL函数和PL / pgSQL函数之间有什么区别?


问题答案:

您自己将手册中的关键句子加粗了:

SQL函数的整个主体在执行任何函数之前都会被解析。

另请参阅手册中有关
解析器阶段 的信息

它由两个主要部分组成: 解析器转换过程
。引用手册:

改造过程中 需要由解析器树递回作为输入,并确实了解哪些表,函数,和运营商查询所引用所需的语义解释。

如果SQL函数包含以下命令:

CREATE TABLE foo (...);
INSERT INTO foo VALUES(...);

几乎同时计划了这两个语句(基于系统目录的相同快照)。因此,INSERT不能看到表“ foo”可能是由上一条CREATE命令创建的。这就产生
了以下问题之一

  1. 如果没有 其他的 名为“foo”表在你search_patch(还),Postgres的抱怨 试图创建时 的功能:
ERROR:  relation "foo" does not exist
  1. 如果您的表中已经存在另一个名为“ foo”的表search_patch(并且您不使用冲突的列名),则Postgres将INSERT基于该表进行计划。如果任何值导致(错误!)表中的冲突,通常会 在执行时 导致错误。或者,如果运气不好,它甚至可能在没有错误消息的情况下写入该表!非常偷偷摸摸的错误。

使用 PL / pgSQL 函数不会发生这种情况,因为它会将SQL命令像预处理语句一样按 _ 顺序_
计划和执行。因此,每个语句都可以查看在先前语句中创建的对象

因此,从未访问过的语句甚至都不会被计划-与SQL函数不同。语句的执行计划可以缓存在同一会话中-与SQL函数不同。在此处阅读有关PL /
pgSQL函数中计划缓存的详细信息。



 类似资料:
  • 主要内容:1. 创建函数,2. 调用函数,3. PL/SQL递归函数在本章中,我们将讨论和学习PL/SQL中的函数。函数与过程(也叫程序)相同,只不过函数有返回一个值,而过程没有返回值。 因此,上一章中所有有关存储过程的内容也适用于函数。 1. 创建函数 使用语句创建独立函数。语句的简化语法如下: 其中, function-name是指定要创建的函数的名称。 [OR REPLACE]选项指示是否允许修改现有的函数。 可选参数列表包含参数的名称,模式和类型。 表示将

  • 对于PL/pgSQL来说是全新的,这个函数中的双美元符号是什么意思: 我猜,在中,是占位符。 最后一行有点玄机:< code > $ $ LANGUAGE plpgsql STRICT IMMUTABLE; 顺便问一下,最后一行是什么意思?

  • 问题内容: tf.nn.embedding_lookup(params, ids, partition_strategy=’mod’, name=None) 我不了解此功能的职责。像查找表吗?用哪种方法返回每个ID对应的参数(以ID为单位)? 例如,在模型中,如果使用,则为每个找到对应的嵌入? 问题答案: 函数检索张量的行。该行为类似于对numpy中的数组使用索引。例如 参数也可以是张量的列表,在

  • 问题内容: 最近,我开始使用Python3,它缺乏xrange的好处。 简单的例子: 1) Python2: 2) Python3: 结果分别是: 1) 1.53888392448 2) 3.215819835662842 这是为什么?我的意思是,为什么xrange被删除了?这是学习的好工具。对于初学者来说,就像我自己一样,就像我们都处在某个时刻。为什么要删除它?有人可以指出我正确的PEP,我找不

  • 我正在学习Java,正在使用java 8,spring 5.3.9和Apache Tomcat 9。我已经将我的jar文件添加到我的构建路径中的类路径中,将Apache Tomcat添加到我的服务器中,我的项目运行得非常好。现在我开始使用beans和xml文件,我遇到了一个问题。我的代码的一部分被触发,另一部分被忽略。 我有以下界面 FortuneService.java: 和一个快乐财富服务类: