在一个项目的用例中我遇到了一个奇怪的情况:ESQL正在调用一个java方法,向它发送一个String输入参数,该方法将解组,应用一些逻辑,然后存储来自unmarshalled对象的有用信息.因此,该方法必须抛出JAXBException,或者使用try catch来处理可能的异常.
这个问题是,ESQL无法调用包含签名中的throws的java方法.但是,我们希望任何错误都可以回到之前调用的MBNode,因此可以在那里进行适当的处理,因此trycatch不在图片之内.
让我感到震惊的是,遇到问题时是不可能返回一种Exception,如果没有则返回null?所以我写了一个简单的方法,虽然我没有得到任何警告或错误,但从良好的编程意义上来说,这似乎是错误的.
例如:
public Exception doStuffAndCheckForErorrs(String inString)
{
if(inString.equals(null))
{
return new Exception("Your string is null");
}
else
return null;
}
Run Code Online (Sandbox Code Playgroud)
但是我对这样做有什么不好的感觉.
我愿意接受任何想法或不同的解决方案,特别是如果有解决ESQL签名问题的方法.
更新:
添加有关ESQL过程无法在签名中使用throws子句调用java方法的参考.
摘自CREATE PROCEDURE语句部分下的此链接:
"您要调用的任何Java方法都必须具有以下基本签名:public static(<0 - N parameters>)其中必须位于ESQL到Java数据类型映射表中的Java IN数据类型列表中(不包括REFERENCE类型,不允许作为返回值)或Java void数据类型.参数数据类型也必须在ESQL到Java数据类型映射表中.此外,Java方法不允许有异常在其签名中抛出条款."
java error-handling exception ibm-integration-bus extended-sql
我在esql(IBM Websphere Message Broker)中有一个子流,我需要在其中实现类似于select distinct功能的功能。
一些背景:我在Oracle数据库中有一个表group_errcode_ref。该表几乎是ERROR_CODEand 的固定链接/映射ID。ERROR_CODE是唯一的,但ID可以重复。例如,错误代码4000和4001都可以链接到ID 1。
在我的esql子流中,我有一系列错误代码,这些错误代码根据进入该流的当前数据而有所不同。
所以我需要做的是获取输入错误代码数组,并ID从表中为数组中的所有错误代码选择group_errcode_ref
我现在所拥有的:
declare db rows;
set db.rows[] = (select d.ID from Database.group_errcode_ref as d where d.ERROR_CODE in (select D from errCodes.Code[] as D);
Run Code Online (Sandbox Code Playgroud)
errCodes是来自输入的错误代码的数组。row是与错误代码对应的所有ID的数组。
很好,但是我想从db.rows[]数组中删除重复项。
我不确定在esql中执行此操作的最佳方法,但它不支持distinct。group by, 要么order by
如何在ESQL中将从外部系统检索到的JSON响应转换为有意义的数据(键/值对)?
检索的JSON:
{
"data": [
{
"name": "application.info.header",
"value": "headerValue"
},
{
"name": "entity.statistics.name.fullName",
"value": "fullNameValue"
},
{
"name": "application.info.matter",
"value": "matterValue"
},
{
"name": "entity.statistics.skill",
"value": "skillValue"
}
]
}
Run Code Online (Sandbox Code Playgroud)
哪里,
name 〜JSON的层次结构(最后一个属性是关键)
value 〜对关键的价值
预期的JSON:
{
"data": {
"application": {
"info": {
"header": "headerValue",
"matter": "matterValue"
}
},
"entity": {
"statistics": {
"name": {
"fullName": "fullNameValue"
},
"skill": "skillValue"
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
不用说,这可以通过Java中的Split方法轻松实现-我正在寻找ESQL中合适的方法。
当前的ESQL模块:
CREATE COMPUTE MODULE getDetails_prepareResponse
CREATE FUNCTION Main() RETURNS BOOLEAN …Run Code Online (Sandbox Code Playgroud) esql中CURRENT_TIME函数的默认格式是什么?我们如何根据我们的要求更改它(24小时或12小时格式)
我正在尝试将WMB 7映射节点转换为IIB 9节点.自动转换过程将一些ESQL函数转换为XQuery函数.
具体来说,它改变了ESQL功能
COALESCE (var0, var1)
Run Code Online (Sandbox Code Playgroud)
(返回第一个非空值,如if var0 = null then var1 else var0)
XQUERY (var0,var1)
Run Code Online (Sandbox Code Playgroud)
这是正确的转换吗?
如果是,有人可以提供API的链接吗?我在XQuery语法和操作员手册上找不到这个.
Websphere Message Broker:文件输出示例中的文件.我有一个带有重复元素结构的XML文件.如何在ESQL中访问和修改特定元素的值.我按照以下代码行事
CREATE PROCEDURE CopyEntireMessage() BEGIN
--SET OutputRoot = InputRoot;
DECLARE I INTEGER 1;
DECLARE J INTEGER;
SET J = CARDINALITY(OutputRoot.*[]);
WHILE I < J DO
SET OutputRoot = InputRoot;
SET OutputRoot.XMLNS.person.student[I].name = 'XYZ';
SET I = I + 1;
END WHILE;
END;
Run Code Online (Sandbox Code Playgroud)
但它不起作用.从输入文件夹中提取文件但我在Output文件夹中看不到任何内容.但如果我评论
SET OutputRoot.XMLNS.student[I].name = 'XYZ';
Run Code Online (Sandbox Code Playgroud)
然后文件在输出文件夹中可用,因为它没有任何变化.
我的XML文件如下
<person>
<student>
<name>ABC</name>
<age>20</age>
<address>city1</address>
</student>
<student>
<name>PQR</name>
<age>20</age>
<address>city2</address>
</student>
</person>
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮我吗?
以下输入xml字段需要包含6个字符,每6个字符应分割并保存在输出的选项字段中.
Input:
<feature>124414500045563879</feature>
output:
<option>124414</option>
<option>500045</option>
<option>563879</option>
Run Code Online (Sandbox Code Playgroud)
IIB ESQL中是否有任何tokenizer功能可用于实现上述结果.
我有一个看起来像这样的输入 xml
<log>
<line>
<id>1</id>
<line>
<id>2</id>
<otherLine>
<id>2</id>
<field>
12345-67
</field>
</otherLine>
</log>
Run Code Online (Sandbox Code Playgroud)
我在 esql 中所做的基本上是迭代每个<line>元素,我想从值匹配的<otherLine>地方检索<id>值。
我有这样的代码:
declare inDoc reference to InputRoot.XMLNSC.log;
declare line reference to inDoc;
declare fieldValue character;
move line firstchild name 'line';
while lastmove(line) do
set fieldValue = select r.field from inDoc.otherLine[] as r where r.id = line.id;
-- I want this to be null when hitting the line with <id>1</id> and 12345-67 and hitting the line with <id>2</id>
move …Run Code Online (Sandbox Code Playgroud)