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

ODI: How to correctly define and pass variables between tasks inside Knowledge Module?

我正在构建自定义 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 ) 

我做错了什么?

第一次尝试:

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

尝试

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

在第二次尝试中,我不确定出了什么问题。会不会是<%关时session还不可用?您可以通过在 Jython 上设置 KM step Technology 并使用此代码来调试它:

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

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