PostgreSQL触发函数报错:JSON数据插入目标表修复求助
修正PostgreSQL触发函数语法错误
你之前的触发函数语法错误的核心原因是混用了VALUES子句和FROM查询——VALUES仅适用于插入固定的单条/多条静态值,而你需要从JSON中解析出多条动态数据插入,正确的写法是直接使用INSERT ... SELECT结构。
下面是修正后的完整触发函数:
CREATE OR REPLACE FUNCTION student_data_trigger_function() RETURNS TRIGGER AS $BODY$ BEGIN INSERT INTO students_target (doc_id, document_type, document_name, grade_name, student_name, avg_marks, rank_cd) SELECT NEW.doc_id, NEW.doc_data ->> 'document_type', NEW.doc_data ->> 'document_name', grade ->> 'grade_name', student ->> 'student_name', (student ->> 'avg_marks')::INT, student ->> 'rank' FROM json_array_elements(NEW.doc_data -> 'data' -> 'grades') AS grade, json_each(grade -> 'sections') AS section(key, value), json_array_elements(section.value) AS student WHERE student ->> 'rank' = 'AA+'; RETURN NEW; END; $BODY$ LANGUAGE plpgsql;
关键修正点说明:
- 移除错误的
VALUES()包裹:直接将你之前验证过的查询逻辑整合到INSERT语句中,用SELECT动态生成要插入的数据行 - 类型转换处理:
student->>'avg_marks'返回的是字符串类型,而目标表students_target的avg_marks是INT类型,必须通过::INT做类型转换,否则会出现类型不匹配错误 - 修正函数名拼写:原函数名
student_data_triger_function少了一个字母g,改为student_data_trigger_function,避免调用时出现找不到函数的问题
如果还未创建对应的触发器,执行以下语句完成创建:
CREATE TRIGGER trigger_students_source_insert AFTER INSERT ON students_source FOR EACH ROW EXECUTE FUNCTION student_data_trigger_function();
内容的提问来源于stack exchange,提问作者Iniyavan
相关产品推荐
相关产品推荐

