首页 > 解决方案 > ppgsql从参数声明变量

问题描述

我正在从命令行运行 sql 查询,我在其中传入名为 tablename 的值:

psql "hostname" -v tablename=$1 -a -q -f "filename.sql"

然后我像这样设置变量:

\set tablename :tablename

然后我有一个函数,我想像这样使用变量表名:

DO $$
BEGIN
    
    if (tablename = 'movie_table') then
     -- query goes in here 
    END if;
END;
$$;

我还尝试使用以下几种变体来声明变量:

DECLARE tablename varchar := :tablename;

如果您有任何建议,请告诉我。我收到以下错误:

syntax error at or near ":"

标签: sqlpostgresqlpgadmin

解决方案


您的代码无法工作,因为您尝试在服务器端(plpgsql)读取客户端变量(psql)。您需要将值推送到自定义服务器端变量,在下一步中您可以从 plpgsql 环境中读取它:

postgres=# \set client_side_var Ahoj
postgres=# select set_config('my.client_side_var', :'client_side_var', false);
┌────────────┐
│ set_config │
╞════════════╡
│ Ahoj       │
└────────────┘
(1 row)

postgres=# do $$
declare var text default current_setting('my.client_side_var');
begin
   raise notice '>>>%<<<', var;
end;
$$;
NOTICE:  >>>Ahoj<<<
DO

您不能:var在 plpgsql 代码中使用 psql 语法。


推荐阅读