ODI:如何在知识模块内的任务之间正确定义和传递变量?

时间:2017-06-22 09:50:06

标签: oracle oracle-data-integrator

我正在构建一个自定义IKM,我需要在执行期间在内存中保留一些值。所以在第一个任务中,我尝试定义将在以下任务中使用的所有变量。

例如,我需要将会话号作为整数。我是这样做的:

<% 
int SESSIONID = Integer.parseInt(<?=odiRef.getSession("SESS_NO")?>); 
%>

但是我收到以下错误:

Parse error at line 2, column 17.  Encountered: <
Pre-execution text:
int SESSIONID = 699;
out.print("");

<%
String sessionNo = odiRef.getSession("SESS_NO");
int SESSIONID = Integer.parseInt(sessionNo);
%>

也无效:

Sourced file: inline evaluation of: `` String sessionNo =             
odiRef.getSession("SESS_NO"); Integer SESSIONID = Integer.pa . . . '' : Typed variable declaration : Method Invocation Integer.parseInt
Target error:
For input string: "707"
Pre-execution text:
String sessionNo = odiRef.getSession("SESS_NO");
int SESSIONID = Integer.parseInt(sessionNo);
out.print("");
Error text:
Integer .parseInt ( sessionNo ) 

我做错了什么?

1 个答案:

答案 0 :(得分:2)

第一次尝试:

  • <%标记在<?标记之前执行/替换,因此odiRef.getSession()不会被替换。我会在外部标记上使用<$<@,因此它会在替换后发生。更多信息在这篇优秀博客的末尾:https://devepm.com/2014/09/16/odi-substitution-tags-demystified/
  • 因为odiRef.getSession()将在代码执行的其余部分之前被替换,所以它必须被双引号括起来才能被视为字符串。
  • Integer.parseInt()返回一个int,所以我将它存储到int而不是Integer中。如果要将其存储为整数,请改用Integer.valueOf()。

尝试

<@ 
int SESSIONID = Integer.parseInt("<?=odiRef.getSession("SESS_NO")?>"); 
@>

在第二次尝试中,我不确定是什么错。可能是会话在<%通行证尚未提供吗?您可以通过在Jython上设置KM step Technology来调试它并使用以下代码:

raise '<%=odiRef.getSession("SESS_NO")%>'

这会在运算符的错误消息中显示SESS_NO的值。