我可以在 ESQL 中执行 CAST 引用吗?

Can I do CAST reference in ESQL?

从 IBM 文档复制示例时:https://www.ibm.com/support/knowledgecenter/SSMKHH_9.0.0/com.ibm.etools.mft.doc/ak04864_.htm 使用以下示例消息: https://www.ibm.com/support/knowledgecenter/SSMKHH_9.0.0/com.ibm.etools.mft.doc/ak05911_.htm 没有应用消息模型, 在: IBM 集成工具包版本:10.0.0.16 使用以下代码片段:


    CALL CopyEntireMessage();
    -- Declare the dynamic reference
    DECLARE myref REFERENCE TO OutputRoot.XMLNSC.Invoice.Purchases.Item[1];
    -- Continue processing for each item in the array
    WHILE LASTMOVE(myref)=TRUE
        DO
        -- Add 1 to each item in the array
        SET myref = CAST(myref AS INTEGER) + 1; 
        -- Move the dynamic reference to the next item in the array
        MOVE myref NEXTSIBLING;
    END WHILE;

突然发现下面一行代码:

SET myref = myref + 1;

或者:

SET myref = CAST(myref AS INTEGER) + 1; 

对第一项中的值没有任何影响,而且,更重要的是,它阻止了预期的工作:

MOVE myref NEXTSIBLING;

所以 myref 指针没有移动到下一个兄弟节点(没有从项目 [1] 移动到项目 [2])并且 myref 只是从我的调试视图中的变量列表中消失了。

我的问题:

知道为什么 SET myref = myref + 1;SET myref = CAST(myref AS INTEGER) + 1; 不起作用吗?根据文档,后者应该在没有消息模型的情况下工作。

我无法解释这些症状,但我可以提出一些有用的建议:

  1. 不要在 ESQL 中使用计数循环。使用 FOR 循环遍历数组几乎总是更好。
CALL CopyEntireMessage();
    -- For each item in the array...
    FOR refItem AS OutputRoot.XMLNSC.Invoice.Purchases.Item[] DO
        SET refItem = CAST(refItem AS INTEGER) + 1; 
    END FOR;

无需声明引用变量(但如果需要,您可以声明,以阻止 ESQL 编辑器抱怨 'undeclared' 引用变量)。 无需自己移动引用变量 - FOR 循环会为您完成。

  1. 如果您真的想知道为什么您的 WHILE 循环不起作用...

您会发现调试器只告诉您发生了什么。但是(正如您发现的那样)它无法告诉您 为什么 它会发生。为此,您需要一个用户跟踪。不是 Trace 节点,是用户跟踪。您必须打开 IIB 控制台并使用 mqsichangetrace、mqsireadlog、mqsiformatlog 命令(按此顺序)启动用户跟踪、读取它并将其格式化为文本。前几次有点麻烦,但它几乎肯定会告诉你为什么你的代码不起作用。