【发布时间】:2019-01-20 07:59:40
【问题描述】:
我最近开始使用 IBM Integration Bus v10.0.0.9,使用他们关于它如何工作的文档以及 ESQL 语法和技巧。
根据this,他们建议使用引用来访问消息树,以免进行太多导航。他们甚至展示了如何将引用变量 here 用于 OutputRoot 消息树。
知道了这一点,我一直在尝试在 ComputeNode 中执行以下操作:
-- ComputeNode MRM Writer
DECLARE refPointer REFERENCE TO OutputRoot.MRM.PARENT_NODE;
SET refPointer.CHILD_NODE = 'Some value';
理论上,这应该等价于:
SET OutputRoot.MRM.PARENT_NODE.CHILD_NODE = 'Some value';
但是,当试图达到下一个 ComputeNode 上的值时,我发现它为空:
-- ComputeNode MRM Reader
DECLARE someValue CHARACTER InputRoot.MRM.PARENT_NODE.CHILD_NODE;
我尝试使用CREATE LASTCHILD OF OutputRoot.MRM DOMAIN 'MRM' NAME 'PARENT_NODE';,然后尝试引用但仍然给出空值。而且我知道问题出在使用参考值时,我使用完整路径时存在值。我也知道引用确实有效,因为我使用引用变量从 InputRoot 消息树中获取值。
我可以做些什么来使参考工作有效?还是不能将它们用于某些域,如果可以,哪些域?
编辑
我注意到这个问题很普遍,即使使用常规的 OutputRoot.XMLNSC 引用也会发生。所以问题不在于 MRM 域,而在于引用本身。 我还注意到,如果我为引用设置一个环境变量,然后将 OutputRoot.MRM 设置为环境变量的值,它似乎可以解决,但这样做相当多余,并且由于某种原因它有时会失败。
-- Redundant workaround:
SET Environment.Variables.Output = refPointer;
SET OutputRoot.MRM.PARENT_NODE = Environment.Variables.Output;
SET Environment.Variables.Output = NULL;
【问题讨论】:
-
您的第一个计算节点的模式是否设置为消息?您可以通过User Trace 获取更多信息。
-
您不应该使用 OutputRoot.MRM。在所有当前支持的 IIB 版本中,DFDL 域是比 MRM 域更好(也更容易)的替代方案。
-
@DanielSteinmann 模式设置为消息。正如我所说的,只有当我使用引用而不是直接调用整个树字段时才会出现问题。
-
@kimbert 我无法更改当前正在使用的结构,因此我必须保留 OutputRoot.MRM 设计。我只是想优化计算代码,因为它有 30 多行使用完整路径。
-
你需要在赋值前创建一个子属性:CCREATE FIELD OutputRoot.MRM.PARENT_NODE TYPE NameValue VALUE 'This is my TestCase';
标签: reference ibm-integration-bus extended-sql