在 PL/pgSQL 匿名块中引用 psql 参数
Posted
技术标签:
【中文标题】在 PL/pgSQL 匿名块中引用 psql 参数【英文标题】:Reference psql parameter inside PL/pgSQL anonymous block 【发布时间】: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
,则不运行它。
【问题讨论】:
与***.com/questions/34753914基本相同 【参考方案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);
给函数一个唯一的名字,这样你就不会冒丢失其他东西的风险。
【讨论】:
这里的补充技术:***.com/a/9981540/48729以上是关于在 PL/pgSQL 匿名块中引用 psql 参数的主要内容,如果未能解决你的问题,请参考以下文章
是否可以在 Spring Data JPA Repository 的 @Query 注释中使用 PostgreSQL 匿名块(PL/pgSQL)?
如何在 PostgreSQL、PL/pgSQL 上执行匿名代码块切换 CASE 语句?
如何在 C# 中从 Npgsql 4.1.5.0 执行匿名块 PL/pgSQL (PostgreSQL 13)