我可以在 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;
不起作用吗?根据文档,后者应该在没有消息模型的情况下工作。
我无法解释这些症状,但我可以提出一些有用的建议:
- 不要在 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 循环会为您完成。
- 如果您真的想知道为什么您的 WHILE 循环不起作用...
您会发现调试器只告诉您发生了什么。但是(正如您发现的那样)它无法告诉您 为什么 它会发生。为此,您需要一个用户跟踪。不是 Trace 节点,是用户跟踪。您必须打开 IIB 控制台并使用 mqsichangetrace、mqsireadlog、mqsiformatlog 命令(按此顺序)启动用户跟踪、读取它并将其格式化为文本。前几次有点麻烦,但它几乎肯定会告诉你为什么你的代码不起作用。
从 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;
不起作用吗?根据文档,后者应该在没有消息模型的情况下工作。
我无法解释这些症状,但我可以提出一些有用的建议:
- 不要在 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 循环会为您完成。
- 如果您真的想知道为什么您的 WHILE 循环不起作用...
您会发现调试器只告诉您发生了什么。但是(正如您发现的那样)它无法告诉您 为什么 它会发生。为此,您需要一个用户跟踪。不是 Trace 节点,是用户跟踪。您必须打开 IIB 控制台并使用 mqsichangetrace、mqsireadlog、mqsiformatlog 命令(按此顺序)启动用户跟踪、读取它并将其格式化为文本。前几次有点麻烦,但它几乎肯定会告诉你为什么你的代码不起作用。