websphere - 我可以在 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;
不工作吗?根据该文件,后者应该在没有消息模型的情况下工作。
解决方案
我无法解释这些症状,但我可以提出一些有用的建议:
- 不要在 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 循环会为您完成。
- 如果你真的想知道为什么你的 WHILE 循环不工作......
你会发现调试器只告诉你发生了什么。但是(正如您所发现的那样)它无法告诉您它为什么会发生。为此,您需要用户跟踪。不是 Trace 节点,是用户跟踪。您必须打开 IIB 控制台并使用 mqsichangetrace、mqsireadlog、mqsiformatlog 命令(按此顺序)来启动用户跟踪、读取它并将其格式化为文本。前几次有点麻烦,但它几乎肯定会告诉你为什么你的代码不工作。
推荐阅读
- android - 如何在整个主题中更改 AppBarLayout 的样式?
- java - 无法正确执行 jar - 线程“AWT-EventQueue-0”java.lang.NoClassDefFoundError 中的异常
- angular - Ionic Firebase Analytics 无法正常工作
- git - 在不删除旧分支的情况下重新设置基准
- c# - 如何使用 c# 在 microsoft botframework sdk V4 中获取异常的堆栈跟踪以及默认错误消息
- vue.js - vue-konva 使 v-text 使用 vars/props
- javascript - 阿博杜随机数
- sql-server - 为什么聚集索引查找工作缓慢?
- postgresql - Postgresql:如何在最后一个分隔符之后修剪字符串,仅当有多个分隔符时
- java - 对函数的调用不对应于任何重载