在PL / pgSQL匿名块中引用psql参数

时间:2016-01-20 23:40:18

标签: postgresql plpgsql psql

我想通过psql命令行将参数传递给匿名do $$ begin if (':para' = 1) then -- statements; end if; end $$ ; 块,然后在条件中检查该参数。

SQL的相关部分在这里:

psql -d dbname -v para=1 < script.sql

我这样称呼这个脚本:

ERROR:  invalid input syntax for integer: ":para"
LINE 1: SELECT (':para' = 1)
            ^
QUERY:  SELECT (':para' = 1)
CONTEXT:  PL/pgSQL function inline_code_block line 3 at IF

我收到错误:

psql

我尝试使用case / when范例,但也没用。

我猜测delete参数与PL / pgSQL不兼容?最终,如果我将1作为psql参数传递,我的目标是运行一个0语句,如果我通过{{1}}则不会运行它。

1 个答案:

答案 0 :(得分:2)

psql解析器无法查看字符串内部的内容。这可能是你想要的:

delete from t
where :para = 1

在匿名阻止之外执行此操作。如果您真的需要PL/pgSQL使用参数化函数:

create or replace function f(_para integer)
returns void as $$
begin
    if _para = 1 then
        --statements
    end if;
end; $$ language plpgsql;

您的脚本文件将包含:

select f(:para);

如果您不想永久地向db添加一个函数,请在脚本中执行所有操作:

drop function if exists f_iu7YttW(integer);

create or replace function f_iu7YttW(_para integer)
returns void as $$
begin
    if _para = 1 then
        --statements
    end if;
end; $$ language plpgsql;

select f_iu7YttW(:para);

drop function f_iu7YttW(integer);

为该函数指定一个唯一的名称,这样您就不会冒丢弃其他内容的风险。