【发布时间】:2017-11-02 11:23:27
【问题描述】:
我有一个带有 DO 块的 SQL 函数,当尝试访问 DO 块内的封闭函数的参数时,我收到“列不存在”错误。我错过了什么?
CREATE OR REPLACE FUNCTION f1(a1 TEXT) RETURNS VOID AS $$
DO $DO$
BEGIN
RAISE NOTICE 'a1 = %', a1;
END
$DO$;
$$ LANGUAGE SQL VOLATILE;
SELECT f1('AA');
错误:列“a1”不存在 SQL 状态:42703 上下文: PL/pgSQL 函数 inline_code_block 第 3 行在 RAISE SQL函数“f1”语句1
【问题讨论】:
-
这没有意义。如果你想使用 PL/pgSQL,那你为什么不干脆把那个函数变成一个 PL/pgSQL 函数呢?
-
我的实际函数已经包含一些重要的 SQL 代码,我宁愿不删除它并将其重新创建为 plpgsql。
-
一个 SQL 函数只能包含一条 SQL 语句,因此将其转换为 PL/pgSQL 函数不需要太多工作。您只需添加一个
begin ...end,在select前面添加一个return query,然后将language sql更改为语言plpgsql。您显然需要 PL/pgSQL,否则您将没有DO块。 -
原来的函数确实包含几个SQL语句。我知道只有最后一个可以返回值的事实。无论如何,我确实删除了该函数并创建为 PLPGSQL。
标签: postgresql stored-procedures scope plpgsql