【发布时间】:2014-02-26 10:03:48
【问题描述】:
我需要创建一个触发器,在将数据插入另一个表 (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
触发器主体中的插入语句应从tableA 中的xmlColumn 中提取varchars,并将提取的数据插入tableC。我认为问题在于xmlColumn 是XML 类型,在DB2 中禁止在触发器主体中引用XML 列。根据this,这个限制可以通过使用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。
【问题讨论】: