PostgreSQL:在 DO 块中访问封闭函数的参数
PostgreSQL: Access enclosing function's argument inside DO block
我有一个 SQL 函数,它有一个 DO 块,当试图访问 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');
ERROR: column "a1" does not exist
SQL state: 42703
Context: PL/pgSQL function inline_code_block line 3 at RAISE
SQL function "f1" statement 1
我猜您想有可能在 SQL 函数中发出通知。然而,DO 块不是一个好主意,因为函数的参数在其中是不可见的。相反,您可以准备一个引发通知的辅助函数:
create or replace function raise_notice(anyelement)
returns void language plpgsql as $$
begin
raise notice '%', ;
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)
您的语言规范有误
$$ LANGUAGE SQL VOLATILE;
应该是:
$$ LANGUAGE plpgsql VOLATILE;
新增DO
语句,默认有plpgsql语言
我有一个 SQL 函数,它有一个 DO 块,当试图访问 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');
ERROR: column "a1" does not exist SQL state: 42703 Context: PL/pgSQL function inline_code_block line 3 at RAISE SQL function "f1" statement 1
我猜您想有可能在 SQL 函数中发出通知。然而,DO 块不是一个好主意,因为函数的参数在其中是不可见的。相反,您可以准备一个引发通知的辅助函数:
create or replace function raise_notice(anyelement)
returns void language plpgsql as $$
begin
raise notice '%', ;
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)
您的语言规范有误
$$ LANGUAGE SQL VOLATILE;
应该是:
$$ LANGUAGE plpgsql VOLATILE;
新增DO
语句,默认有plpgsql语言