用于存储过程的UDF不适用于参数中的数据

2020-09-15 15:11发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


嘿大师们,

我面对UDF有点奇怪。 我有一个重新查询,在这里我需要调用3个存储过程,它们之间可能存在依赖关系。 例如,我需要执行第一个SP,该SP为我提供了要在第二个存储过程中使用的值,并且它的结果需要用作第三个SP中的参数,并且将发送来自最后一个SP的数据 通过邮件。

因此,为此,我正在使用一个发送方JDBC通道来调用第一个SP,一个接收方MAIL通道来发送邮件(都在同一集成流程中),以及一个JDBC接收器通道用于通过UDF调用其余的SP。

一切看起来都不错,但是我发现UDF出现了问题。

代码是下一个:

 Channel channel = null;
 地图rowMap = null;
 DataBaseAccessor访问器= null;
 DataBaseResult resultSet = null;

 字符串查询=" CALL SP1(55)";

 尝试{

 channel = LookupService.getChannel(" BS_XXX"," CC_JDBC_LOOKUP_Receiver");

 访问器= LookupService.getDataBaseAccessor(channel);

 resultSet = accessor.execute(Query);
 for(迭代器行= resultSet.getRows(); rows.hasNext();){
 rowMap =(Map)rows.next();
 result.addValue((String)rowMap.get(" field_name"));
 }
 }
 catch(特例例外){
 result.addValue(ex.getMessage());
 } 

查询是对存储过程的调用,该存储过程收到一个值,该值是我在接口启动后从第一次调用中获得的值(例如55)。

使用此UDF,我可以获得所需的值。 但是这个" 55"在UDF中是硬编码的,所以我在UDF中添加了一个参数,以便可以从映射字段中接收值。

通过这种方式测试此UDF时,出现下一个错误:

处理有效负载期间发生异常。 使用通信通道CC_JDBC_LOOKUP_Receiver调用适配器时出错(聚会:,服务:BS_XXX,对象ID:d00c03ada97a3758oa9395ec0b41a297)XI AF API调用失败。 模块异常:(无可用信息)。 原因异常:'在sax解析器中处理请求时出错:对表/存储的proc执行语句时出错。 "表"(结构"语句"):java.sql.SQLException:发生语法错误。 com.sap.aii.mapping.lookup.LookupException:使用通信通道CC_JDBC_LOOKUP_Receiver调用适配器时发生错误(参与方:,服务:BS_XXX,对象ID:d00c03ada97a3758ba9395ec0b41a297)XI AF API调用失败。 模块异常:(无可用信息)。 原因异常:'在sax解析器中处理请求时出错:对表/存储的proc执行语句时出错。 "表"(结构"语句"):java.sql.SQLException:发生语法错误。"。

这对我来说真的很奇怪,因为调用UDF的字符串与我进行硬编码时完全相同(我检查了这个,并且是相同的)。

因此在UDF中对SP参数进行硬编码是可行的,但是将值(作为字符串)传递给了我该异常。

有什么想法吗? 可能是某种错误吗?

感谢进阶!

edit:当我接收到作为参数的值时,UDF代码是下一个:

字符串查询=" CALL SP1(";
 Query = Query.concat(mapping_field_value +")"); 

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


嘿大师们,

我面对UDF有点奇怪。 我有一个重新查询,在这里我需要调用3个存储过程,它们之间可能存在依赖关系。 例如,我需要执行第一个SP,该SP为我提供了要在第二个存储过程中使用的值,并且它的结果需要用作第三个SP中的参数,并且将发送来自最后一个SP的数据 通过邮件。

因此,为此,我正在使用一个发送方JDBC通道来调用第一个SP,一个接收方MAIL通道来发送邮件(都在同一集成流程中),以及一个JDBC接收器通道用于通过UDF调用其余的SP。

一切看起来都不错,但是我发现UDF出现了问题。

代码是下一个:

 Channel channel = null;
 地图rowMap = null;
 DataBaseAccessor访问器= null;
 DataBaseResult resultSet = null;

 字符串查询=" CALL SP1(55)";

 尝试{

 channel = LookupService.getChannel(" BS_XXX"," CC_JDBC_LOOKUP_Receiver");

 访问器= LookupService.getDataBaseAccessor(channel);

 resultSet = accessor.execute(Query);
 for(迭代器行= resultSet.getRows(); rows.hasNext();){
 rowMap =(Map)rows.next();
 result.addValue((String)rowMap.get(" field_name"));
 }
 }
 catch(特例例外){
 result.addValue(ex.getMessage());
 } 

查询是对存储过程的调用,该存储过程收到一个值,该值是我在接口启动后从第一次调用中获得的值(例如55)。

使用此UDF,我可以获得所需的值。 但是这个" 55"在UDF中是硬编码的,所以我在UDF中添加了一个参数,以便可以从映射字段中接收值。

通过这种方式测试此UDF时,出现下一个错误:

处理有效负载期间发生异常。 使用通信通道CC_JDBC_LOOKUP_Receiver调用适配器时出错(聚会:,服务:BS_XXX,对象ID:d00c03ada97a3758oa9395ec0b41a297)XI AF API调用失败。 模块异常:(无可用信息)。 原因异常:'在sax解析器中处理请求时出错:对表/存储的proc执行语句时出错。 "表"(结构"语句"):java.sql.SQLException:发生语法错误。 com.sap.aii.mapping.lookup.LookupException:使用通信通道CC_JDBC_LOOKUP_Receiver调用适配器时发生错误(参与方:,服务:BS_XXX,对象ID:d00c03ada97a3758ba9395ec0b41a297)XI AF API调用失败。 模块异常:(无可用信息)。 原因异常:'在sax解析器中处理请求时出错:对表/存储的proc执行语句时出错。 "表"(结构"语句"):java.sql.SQLException:发生语法错误。"。

这对我来说真的很奇怪,因为调用UDF的字符串与我进行硬编码时完全相同(我检查了这个,并且是相同的)。

因此在UDF中对SP参数进行硬编码是可行的,但是将值(作为字符串)传递给了我该异常。

有什么想法吗? 可能是某种错误吗?

感谢进阶!

edit:当我接收到作为参数的值时,UDF代码是下一个:

字符串查询=" CALL SP1(";
 Query = Query.concat(mapping_field_value +")"); 

付费偷看设置
发送
1条回答
打个大熊猫
1楼 · 2020-09-15 15:43.采纳回答

我生成了一个新的UDF,并且似乎正在运行。 该UDF不能解决问题,但是我现在可以做我需要的事情。

为了让任何人都有用,我会保留代码:

 GlobalContainer globalContainer;
 MappingTrace跟踪;
 java.util.Map地图;
 跟踪= container.getTrace();
 globalContainer = container.getGlobalContainer();
//map = globalContainer.getTransformationParameters();
  
//使用的变量
 字符串查询="";
 Channel channel = null;
 DataBaseAccessor访问器= null;
 DataBaseResult resultSet = null;
 查询=" CALL SP1(" + input_parameter +")";
 字符串returnValue ="";
 尝试{
   trace.addInfo(" Query:" + Query);
 channel = LookupService.getChannel(" BS_XXX"," CC_JDBC_LOOKUP_Receiver");
 访问器= LookupService.getDataBaseAccessor(channel);
 resultSet = accessor.execute(Query);
 for(迭代器行= resultSet.getRows(); rows.hasNext();)
 {
 java.util.Map rowMap =(java.util.Map)rows.next();
 returnValue = returnValue +" FIELD1:" +(String)rowMap.get(" field1name")+",";
//returnValue = returnValue +" FIELD2:" +(String)rowMap.get(" FIELD2")+" \ r \ n";
 }
 } catch(Exception ee){
   returnValue ="";
 }
 return returnValue;
 

一周热门 更多>