我正在创建一个通用的自动化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标志?
执行日志:
在引用的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
详细说明: