当前位置: 首页 > 知识库问答 >
问题:

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

锺离慈
2023-03-14

我需要创建一个触发器,在将数据插入另一个表(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中的xmlCol列中提取varchars,并将提取的数据插入到tableC中。我认为问题是xmlCol列是XML类型的,在DB2中禁止引用触发器主体中的XML列。根据这一点,这个限制可以通过使用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我得到这个错误:

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

能可人
2023-03-14

根据您所指的手册页面,限制是在转换变量中使用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;
 类似资料:
  • 问题内容: 如果我 在表上有,如何抛出错误以阻止对该表进行更新? 问题答案: 这是一种可行的技巧。这不是干净的,但看起来可能可行: 本质上,您只是尝试更新不存在的列。

  • 在“name=new.user_name”后面发现意外的标记“end-of-statement”。预期的令牌可能包括:“”..sqlcode=-104,sqlstate=42601,driver=4.9.78 SQL code:-104,SQL state:42601

  • 我试图创建一个触发器,将新插入和/或更新的记录从一个表复制到该表的历史版本。其目的是在每次插入和/或更新表中的记录时保留一条记录。 这是我拥有的创建触发器语句语法,遵循IBMDb2触发器站点。 我收到的错误是: [代码:-104,SQL状态: 42601]在N.LIFECYCLE_STATUS)之后发现了一个意外的令牌END-OF-STATEMENT。预期的令牌可能包括:""... SQLCODE

  • 问题内容: 因此,我是SQLite的SQL Server新手,我习惯于使用New | Old关键字。我已经看到有人使用该值引用新创建的行,但这仅适用于插入而不是更新。如何获得类似此查询中使用的内容的信息? 问题答案: 插入也将适用于更新。一个更新的行将被视为已删除的行和插入的行。因此,您可以检查以前的状态和现在的状态。

  • 在我的OS/400V6中。x系统我使用ADDPFTRG命令为物理文件(DB2表)创建了一个插入后触发器,每当我在RPG IV程序上执行写命令或从STRSQL生成INSERT语句时,该命令都会正确触发,但当我使用JT400(JTOpen)JDBC驱动程序从Java程序执行INSERT语句时,触发器不会触发。 在这两种情况下(从OS400和从Java),都会成功插入记录,但只有从OS400插入记录时才

  • 我知道这是非常不受赞扬的, 我知道这是一个性能、速度等方面的问题,但这是一个集成问题,他们只通过mysql进行更新(我知道这样做也很疯狂,但我无法改变他们所做的,他们正在进行大量的销售,所以他们不想改变任何事情)。 我只需要发布到一个URL(它可以像http://www.google.com?id=skuid) 我读了这个博客和堆栈,但他们是2岁,想知道是否有替代使用udf: http://ope