触发函数,用于追加列插入,语法错误在或附近" NEW"

时间:2017-06-20 16:41:50

标签: postgresql

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类型的表中,但不是触发此触发器函数的插入的一部分。

如果您需要更多信息,请与我们联系。

1 个答案:

答案 0 :(得分:0)

您只能使用EXECUTE执行SQL命令,而不能像分配一样执行PL / pgSQL语句。

我想不出一种简单的方法来为NEW中的变量列赋值;也许你可以查询系统目录,将一个元组组成一个字符串并使用类似的东西:

new_tuple = $$(1, 'something', ...)::test_table$$;
EXECUTE 'SELECT ' || new_tuple INTO NEW;