【问题标题】:Reference psql parameter inside PL/pgSQL anonymous block在 PL/pgSQL 匿名块中引用 psql 参数
【发布时间】:2016-04-27 01:13:36
【问题描述】:

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

SQL的相关部分在这里:

do $$
begin
    if (':para' = 1) then
        -- statements;
    end if;
end $$
;

我这样称呼这个脚本:

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

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

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

【问题讨论】:

标签: postgresql plpgsql psql


【解决方案1】:

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);

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

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);

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-01
  • 2014-09-30
  • 2017-01-29
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
相关资源
最近更新 更多