在 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 ATOMICEND 后,我收到类似于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 列的主要内容,如果未能解决你的问题,请参考以下文章

如何将 DB2 触发器转换为 SQL Server?

触发器中的“新”表有时包含列,有时不包含

在 DB2 触发器中跳过当前行的任何关键字

DB2数据库中的序列和触发器??

db2触发器after insert中怎么取得插入前的数据

如何防止 DB2 中的递归触发器调用