gpt4 book ai didi

sql - 存储过程中不寻常的 UPDATE 语法

转载 作者:行者123 更新时间:2023-11-29 13:11:22 25 4
gpt4 key购买 nike

我需要帮助来理解我在正在审计的遗留系统中发现的这个存储过程。特别是我无法理解 IF 条件中的 UPDATE 命令:UPDATE authors.author_id ... .

DECLARE

p_mem_id ALIAS FOR $1;
p_auth_id ALIAS FOR $2;

res bool ;
v_rec authors.author_gov_id%ROWTYPE;

BEGIN
res := 0;
SELECT INTO v_rec * FROM authors.author_gov_id WHERE author_id = p_auth_id;

IF FOUND THEN
UPDATE authors.author_id = (SELECT gov_id FROM authors.gov_id WHERE mem_id=p_mem_id);
ELSE
.. snip ..
END IF;

RETURN res;
END;

我觉得这很莫名其妙,因为这个更新语句在我的 PSQL 版本中似乎是不受支持的语法[1](没有 SET,直接赋值),并且因为没有称为 authors.author_id 的关系。在我的数据库中(pg_proc 中也没有)。

my_database=# \d authors.author_id;
Did not find any relation named "authors.author_id".

[1] https://www.postgresql.org/docs/9.3/sql-update.html

最佳答案

正如其他人所指出的,这是无效的语法。

但是,当您创建一个函数时,实际的函数代码(“主体”)作为字符串传递,并且不会被检查基本 create function 语法的部分解析。该字符串被移交给指定的“语言”以进行进一步验证。

配置选项check_function_bodies控制是否在创建函数时完成此检查。

如果将其设置为 off,则不会验证正文并且即使正文无效,create function() 也会成功。

所以下面成功地创建了函数:

set check_function_bodies=off;

create function invalid()
returns void
as
$$
begin
update foo.bar = 'this is so wrong';
end;
$$
language plpgsql;

我想您在该数据库中看到的函数代码就是以这种方式创建的。


一个有效的用例是创建相互依赖的函数,而不必考虑它们的创建顺序。

关于sql - 存储过程中不寻常的 UPDATE 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54226314/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com