当我尝试在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;
你能帮我解决一下这个错误的原因吗?
答案 0 :(得分:1)
integer
到json
没有演员阵容。
但由于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;