错误:无法在Postgresql中将类型整数转换为json

时间:2018-01-17 13:55:00

标签: json postgresql function triggers

当我尝试在tableA中插入记录时,我收到以下错误:

QUERY:  insert into schemaname.tableB(col1, col2) values(....)
CONTEXT:  PL/pgSQL function schemaname.funcA() line 5 at SQL statement
********** Error **********
ERROR: cannot cast type integer to json
SQL state: 42846
Context: PL/pgSQL function schemaname.funcA() line 5 at SQL statement

我创建了以下触发器,该函数在提交记录时起作用:

CREATE CONSTRAINT TRIGGER trg_name
  AFTER INSERT
  ON schemaname.tableA
  DEFERRABLE INITIALLY DEFERRED
  FOR EACH ROW
  EXECUTE PROCEDURE schemaname.funcA();

在下面的触发函数中,col1是整数类型,col2是json类型。

CREATE OR REPLACE FUNCTION schemaname.funcA()
  RETURNS trigger AS
$BODY$

BEGIN

insert into schemaname.tableB(col1, col2) values(NEW.val1, json_build_object("abc", NEW.col2val1::json, "def", NEW.col2val2::json, "ghi", NEW.col2val3::json));

RETURN NEW;

END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

你能帮我解决一下这个错误的原因吗?

2 个答案:

答案 0 :(得分:1)

integerjson没有演员阵容。

但由于json_build_object接受任何类型的参数,您可以通过删除触发器函数中的::json强制转换来解决问题。

顺便说一句,使用"abc"作为字符串常量是错误的 - 可能是在尝试对代码进行模糊处理时引入的错误。你必须写'"abc"'

答案 1 :(得分:0)

CREATE OR REPLACE FUNCTION schemaname.funcA()   RETURNS trigger AS $BODY$

    BEGIN

    insert into schemaname.tableB(col1, col2) values(NEW.col1, CAST('{"nameA" : ' ||'"'||NEW.nameA||'", ' || '"nameB" : '||'"'||NEW.nameB||'", ' ||'"nameC" : '||'"'||NEW.nameC||'", ' || '"nameD" : '||'"'||NEW.nameD||'"}' as json));

    RETURN NEW;

    END; $BODY$   LANGUAGE plpgsql VOLATILE   COST 100;