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

inn*_*ble 7 postgresql plpgsql psql

我想PL/pgSQL通过psql命令行将参数传递给匿名块,然后在条件中检查该参数。

SQL 的相关部分在这里:

do $$
begin
    if (':para' = 1) then
        -- statements;
    end if;
end $$
;
Run Code Online (Sandbox Code Playgroud)

我这样称呼这个脚本:

psql -d dbname -v para=1 < script.sql
Run Code Online (Sandbox Code Playgroud)

我收到错误:

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
Run Code Online (Sandbox Code Playgroud)

我尝试使用 case/when 范式,这也不起作用。

我猜psql参数与 PL/pgSQL 不兼容?最终,我的目标是,delete如果我1作为psql参数传递,则运行单个语句,如果传递0.

Clo*_*eto 5

psql分析器无法看到里面是什么字符串。这可能是你想要的:

delete from t
where :para = 1
Run Code Online (Sandbox Code Playgroud)

在匿名块之外进行。如果您确实需要PL/pgSQL使用参数化函数:

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

您的脚本文件将具有:

select f(:para);
Run Code Online (Sandbox Code Playgroud)

如果您不想将函数永久添加到数据库中,请在脚本中执行所有操作:

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);
Run Code Online (Sandbox Code Playgroud)

给函数一个唯一的名字,这样你就不会冒丢失其他东西的风险。