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

问题描述 投票:0回答:1

同时从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;不起作用?根据该文档,后者应在没有消息模型的情况下工作。

websphere extended-sql
1个回答
0
投票

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

  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循环不起作用...

您会发现调试器仅告诉您what正在发生。但是(正如您所发现的那样)它不能告诉您为什么发生了。为此,您需要一个用户跟踪。不是跟踪节点,而是用户跟踪。您必须打开IIB控制台,并使用mqsichangetrace,mqsireadlog,mqsiformatlog命令(按此顺序)开始用户跟踪,将其读取并格式化为文本。前几次比较麻烦,但是几乎可以肯定会向您显示代码为什么不起作用。

© www.soinside.com 2019 - 2024. All rights reserved.