执行字符串 Postgres
Execute String Postgres
我无法使用此代码。这是作为插入、更新或删除触发器的结果执行的。将从多个 table 触发器调用相同的代码。因此,我不知道 table 名称是什么或它们的列是什么。有什么想法吗?
EXECUTE format('INSERT INTO %s VALUES %s', _tbl, (OLD).*);
错误是关于字符串没有被引号包围:
ERROR: column "bangor" does not exist
LINE 1: INSERT INTO sample_test_table_deletes VALUES (3,bangor,D,"20...
^
另一方面,以下作品:
INSERT INTO my_table VALUES((OLD).*);
也就是说,当查询不是通过执行块时。
更新(触发代码):
CREATE OR REPLACE FUNCTION sample_trigger_func() RETURNS TRIGGER AS $$
DECLARE
operation_code char;
table_name varchar(50);
delete_table_name varchar(50);
old_id integer;
BEGIN
table_name = TG_TABLE_NAME;
delete_table_name = TG_TABLE_NAME || '_deletes';
SELECT SUBSTR(TG_OP, 1, 1)::CHAR INTO operation_code;
IF TG_OP = 'DELETE' THEN
OLD.mod_op = operation_code;
OLD.mod_date = now();
RAISE INFO 'OLD: %', (OLD).name;
EXECUTE format('INSERT INTO %s VALUES %s', delete_table_name, (OLD).*);
ELSE
EXECUTE format('UPDATE TABLE %s SET mod_op = %s AND mod_date = %s'
, TG_TABLE_NAME, operation_code, now());
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
特殊变量 OLD
在 EXECUTE
中不可见。 (函数范围内也没有任何其他变量。)使用 USING
构造传入 values:
EXECUTE format('INSERT INTO %I VALUES (().*)', _tbl)
USING OLD;
此外,使用 %I
作为标识符,而不是 %s
。
详情:
- INSERT with dynamic table name in trigger function
我无法使用此代码。这是作为插入、更新或删除触发器的结果执行的。将从多个 table 触发器调用相同的代码。因此,我不知道 table 名称是什么或它们的列是什么。有什么想法吗?
EXECUTE format('INSERT INTO %s VALUES %s', _tbl, (OLD).*);
错误是关于字符串没有被引号包围:
ERROR: column "bangor" does not exist
LINE 1: INSERT INTO sample_test_table_deletes VALUES (3,bangor,D,"20...
^
另一方面,以下作品:
INSERT INTO my_table VALUES((OLD).*);
也就是说,当查询不是通过执行块时。
更新(触发代码):
CREATE OR REPLACE FUNCTION sample_trigger_func() RETURNS TRIGGER AS $$
DECLARE
operation_code char;
table_name varchar(50);
delete_table_name varchar(50);
old_id integer;
BEGIN
table_name = TG_TABLE_NAME;
delete_table_name = TG_TABLE_NAME || '_deletes';
SELECT SUBSTR(TG_OP, 1, 1)::CHAR INTO operation_code;
IF TG_OP = 'DELETE' THEN
OLD.mod_op = operation_code;
OLD.mod_date = now();
RAISE INFO 'OLD: %', (OLD).name;
EXECUTE format('INSERT INTO %s VALUES %s', delete_table_name, (OLD).*);
ELSE
EXECUTE format('UPDATE TABLE %s SET mod_op = %s AND mod_date = %s'
, TG_TABLE_NAME, operation_code, now());
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
特殊变量 OLD
在 EXECUTE
中不可见。 (函数范围内也没有任何其他变量。)使用 USING
构造传入 values:
EXECUTE format('INSERT INTO %I VALUES (().*)', _tbl)
USING OLD;
此外,使用 %I
作为标识符,而不是 %s
。
详情:
- INSERT with dynamic table name in trigger function