在 DB2 的触发器主体中引用 XML 列
Posted
技术标签:
【中文标题】在 DB2 的触发器主体中引用 XML 列【英文标题】:Referencing XML columns in trigger bodies in DB2 【发布时间】: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。
【问题讨论】:
【参考方案1】:根据您所指的手册页,限制是在转换变量中使用 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;
【讨论】:
以上是关于在 DB2 的触发器主体中引用 XML 列的主要内容,如果未能解决你的问题,请参考以下文章