在DB2中的触发器主体中引用XML列

时间:2014-02-26 10:03:49

标签: sql xml triggers db2

我需要创建一个触发器,在将数据插入另一个表(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 ATOMICEND后,我收到类似于DBEdit抛出的错误消息2.在执行完全相同的语句时,不同的数据库编辑器怎么能抛出完全不同的异常?

我正在研究DB2 10 btw。

1 个答案:

答案 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;