首页 > 解决方案 > 我可以在 ESQL 中进行 CAST 引用吗?

问题描述

从 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 Integration Toolkit 版本: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 指针没有移动到下一个兄弟(没有从 item[1] 移动到 item[2]),并且 myref 只是从我的调试视图中的变量列表中消失了。

我的问题:

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

标签: websphereextended-sql

解决方案


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

  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 编辑器抱怨“未声明的”引用变量)。无需自己移动引用变量 - FOR 循环会为您完成。

  1. 如果你真的想知道为什么你的 WHILE 循环不工作......

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


推荐阅读