PostgreSQL:在DO块内访问封闭函数的参数

时间:2017-11-02 11:23:28

标签: postgresql stored-procedures scope plpgsql

我有一个带有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   上下文:RA /中的PL / pgSQL函数inline_code_block第3行   SQL函数“f1”语句1

2 个答案:

答案 0 :(得分:1)

我想您希望有可能在SQL函数中发出通知。然而,DO块不是一个好主意,因为函数的参数在其中是不可见的。相反,您可以准备一个引发通知的辅助功能:

create or replace function raise_notice(anyelement)
returns void language plpgsql as $$
begin
    raise notice '%', $1;
end $$;

现在您可以在SQL函数中使用它,例如:

create or replace function f1(a1 text)
returns text language sql as $$
    select raise_notice(a1);
    select a1;
$$;

select f1('some text');

NOTICE:  some text
CONTEXT:  PL/pgSQL function raise_notice(anyelement) line 3 at RAISE
SQL function "f1" statement 1
    f1     
-----------
 some text
(1 row)

答案 1 :(得分:0)

您的语言规范错误

$$ LANGUAGE SQL VOLATILE;

应该是:

$$ LANGUAGE plpgsql VOLATILE;

DO语句是新的,默认情况下有plpgsql语言。