我需要创建一个触发器,在将数据插入另一个表(tableA)后将行插入表(tableC)。
这些是表格:
tableA tableB tableC
----------------- -------------------- -----------------------------------
id | xmlColumn id | referenceOnA id | extractedData | referenceOnB
(int) | (xml) (int) | (int) (int)| (varchar) | (int)
----------------- -------------------- -----------------------------------
42 | <xml>... 1 | 42 32 | 'string1' | 2
28 | <xml>... 2 | 42 98 | 'string2' | 3
... | ... ... | ... ... | ... | ...
这是触发器声明:
CREATE TRIGGER trigger
AFTER INSERT ON schema.tableA
REFERENCING NEW AS n
FOR EACH ROW MODE DB2SQL
BEGIN ATOMIC
INSERT INTO schema.tableC (extractedData, referenceOnB)
SELECT tmp.extractedData AS extractedData, b.id AS referenceOnB
FROM schema.tableB b, XMLTABLE('...xQueryExpression' PASSING n.xmlColumn
COLUMNS
extractedData VARCHAR(100) PATH '.') AS tmp
WHERE b.referenceOnA = n.id;
END
触发器主体中的insert语句应从xmlColumn
中的tableA
中提取varchars,并将提取的数据插入tableC
。我认为问题是xmlColumn
是XML类型,并且在DB2中禁止引用触发器主体中的XML列。根据{{3}},可以使用XMLTABLE
函数(我做过)来规避这种限制
但是我在DBEdit 2中遇到以下错误:
AN ERROR OCCURRED WHEN BINDING A TRIGGERED SQL STATEMENT.
INFORMATION RETURNED:
SECTION NUMBER: 2
SQLCODE -270,
SQLSTATE 42997,
AND MESSAGE TOKENS. SQLCODE=-20100, SQSTATE=56059, DRIVER=4.7.85
有什么想法吗?
与上述问题无关:
当我在SQL Explorer中执行相同的语句时,我收到此错误:
DB2 SQL Error: SQLCODE=-104, SQLSTATE=42601,
SQLERRMC=<END-OF-STATEMENT>;(.
AT MICROSECONDS MICROSECOND SECONDS MINU, DRIVER 3.65.77
删除BEGIN ATOMIC
和END
后,我收到类似于DBEdit抛出的错误消息2.在执行完全相同的语句时,不同的数据库编辑器怎么能抛出完全不同的异常?
我正在研究DB2 10 btw。
答案 0 :(得分:0)
根据您所指的手册页,限制是在您尝试的转换变量中使用XML数据类型:PASSING n.xmlColumn
这里的示例显示您的INSERT
语句应该看起来像这样:
INSERT INTO schema.tableC (extractedData, referenceOnB)
SELECT tmp.extractedData AS extractedData, b.id AS referenceOnB
FROM schema.tableB b, schema.tableA a,
XMLTABLE('...xQueryExpression' PASSING a.xmlColumn
COLUMNS
extractedData VARCHAR(100) PATH '.') AS tmp
WHERE b.referenceOnA = n.id and b.referenceOnA = a.id;