访问Postgres存储过程中的\ set变量?

问题描述 投票:1回答:1

我正在创建一个通用的自动化Postgres脚本,其中包括DDL,DML,函数和触发器。在大多数操作中,我已经在psql中使用\ set参数化了架构名称,但是在functions的情况下它不起作用。我经过艰苦的搜索,发现了有关[[Dynamic SQL的信息,但这也行不通。

script.sql

\set schema_name myschema CREATE SCHEMA IF NOT EXISTS :schema_name; CREATE table :schema_name.employee ( id serial, name text , dob timestamp, leaves_count int, CONSTRAINT employee_pk PRIMARY KEY (id) ); SELECT create_distributed_table(concat(:'schema_name', '.employee'), 'id'); CREATE table :schema_name.leaves ( id serial, reason text, ts timestamp, employee_id int, CONSTRAINT leaves_pk PRIMARY KEY (id) ); -- STORED PROCEDURE CREATE OR REPLACE FUNCTION :schema_name.deduct_leave_count() RETURNS TRIGGER AS $BODY$ BEGIN UPDATE :schema_name.employee s SET leaves_count = s.leaves_count - 1 WHERE s.id = NEW.employee_id; RETURN NEW; END $BODY$ LANGUAGE plpgsql; -- TRIGGER CREATE TRIGGER trigger_deduct_leave_count BEFORE INSERT ON :schema_name.leaves FOR EACH ROW EXECUTE PROCEDURE :schema_name.deduct_leave_count();
psql -p 5432 -f script.sql

我在函数中出错,因为它无法全局读取变量集。有什么方法可以访问函数内部的psql的全局变量或-v标志?

执行日志:

Execution Logs
postgresql stored-procedures stored-functions citus
1个回答
0
投票
函数的主体是带引号的文字。用美元报价,但都一样。 The manual:

在引用的SQL中不会执行变量插值文字和标识符。

有多种解决方法。由于您正在psql中运行脚本,因此建议您让Postgres用format()为您串联,然后用\gexec执行:

SELECT format($$ CREATE OR REPLACE FUNCTION %1$I.deduct_leave_count() RETURNS trigger LANGUAGE plpgsql AS $func$ BEGIN UPDATE %1$I.employee s SET leaves_count = s.leaves_count - 1 WHERE s.id = NEW.employee_id; RETURN NEW; END $func$ $$, :'schema_name')\gexec

详细说明:

© www.soinside.com 2019 - 2024. All rights reserved.