【问题标题】:Referencing XML columns in trigger bodies in DB2在 DB2 的触发器主体中引用 XML 列
【发布时间】: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。

【问题讨论】:

    标签: sql xml triggers db2


    【解决方案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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多