CREATE TRIGGER update_z
BEFORE INSERT OR UPDATE
ON test_table
FOR EACH ROW
EXECUTE PROCEDURE set_z();
CREATE OR REPLACE FUNCTION set_z()
RETURNS trigger AS
$BODY$
DECLARE
zs record;
BEGIN
SELECT * FROM geography_columns where f_geography_column not like '%_z' AND f_table_name like TG_TABLE_NAME into zs;
EXECUTE 'NEW.'
|| quote_ident(zs.f_geography_column)
|| '_z:= ST_SetSRID(ST_MakePoint(ST_X(NEW.'
|| quote_ident(zs.f_geography_column)
|| '::geometry), ST_Y(NEW.'
|| quote_ident(zs.f_geography_column)
|| '::geometry), 0), 4326)';
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION set_z()
OWNER TO postgres;
错误日志:
2017-06-20 09:27:43 MDT ERROR: syntax error at or near "NEW" at character 1
2017-06-20 09:27:43 MDT QUERY: NEW.location_z := ST_SetSRID(ST_MakePoint(ST_X(NEW.location::geometry), ST_Y(NEW.location::geometry), 0), 4326)
2017-06-20 09:27:43 MDT CONTEXT: PL/pgSQL function set_z() line 7 at EXECUTE
我在现有表格中创建了一个新列,我尝试使用触发/触发功能保持更新。在执行触发器功能之前,一切似乎都正常工作。 location_z列存在于具有PointZ类型的表中,但不是触发此触发器函数的插入的一部分。
如果您需要更多信息,请与我们联系。
答案 0 :(得分:0)
您只能使用EXECUTE
执行SQL命令,而不能像分配一样执行PL / pgSQL语句。
我想不出一种简单的方法来为NEW
中的变量列赋值;也许你可以查询系统目录,将一个元组组成一个字符串并使用类似的东西:
new_tuple = $$(1, 'something', ...)::test_table$$;
EXECUTE 'SELECT ' || new_tuple INTO NEW;