在 PL/pgSQL 匿名块中引用 psql 参数
Reference psql parameter inside PL/pgSQL anonymous block
我想通过 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
.
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);
为该函数指定一个唯一的名称,这样您就不会 运行 放弃其他东西的风险。
我想通过 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
.
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);
为该函数指定一个唯一的名称,这样您就不会 运行 放弃其他东西的风险。