2017-06-29 54 views
1

我想在Knowledge Module的Task中设置一个变量,并将目标技术设置为Java BeanShell。该值表示映射EXPRESSION,其中源表位于MSSQL数据库内。列名被双引号包围,导致模板问题。ODI:KM Java BeanShell - 转义双引号

列表达式为:

source_tab."Entry Number" 

任务(Java的BeanShell的)

<$ 
    String SEL_COLS = "<%=odiRef.getColList(0, "", "[EXPRESSION]\t[ALIAS_SEP] [CX_COL_NAME]", ",\n\t", "", "")%>"; 
$> 

这个变量赋值失败,因为 “source_tab。” 作品编号”没有逃脱 - 代码不编译。

odiRef.getQuotedString不能解决问题...

回答

1

如果生成的代码作为JBS技术中的最终代码执行,则odiRef.getQuotedString可能会有所帮助。当我们使用它以下列方式(在 - ,$ - 或@ 3'-取代?):

<$ 
String SEL_COLS = <%=odiRef.getQuotedString(odiRef.getColList(0, "", "[EXPRESSION]\t[ALIAS_SEP] [CX_COL_NAME]", ",\n\t", "", ""))%>; 
$> 

则导致失败,就像这样:

... Caused by: org.apache.bsf.BSFException: BeanShell script error: 
Parse error at line 3, column 37. Encountered: Entry BSF info: .... 
... 11 more 

Text: <$ 
    String SEL_COLS = "SOURCE_TAB.\"Entry Number\"  ENTRY_NUMBER"; 
$>. 

这看起来不错,但不起作用。它可以作为JBS Technology的最终代码(我指的是所有替代的结果)。不幸的是,任何替换都会使用反斜杠。

好吧,如果标准odiRef-functtion不起作用,让我们自己写的:

<% 
String getQuotedStringCustomized(String s){ 
    return '"'+s.replaceAll('"'.toString(),'"'+"+'"+'"'+"'+"+'"')+'"'; 
} 
%> 
-- other code........ 
<$ 
String SEL_COLS = <%=getQuotedStringCustomized(odiRef.getColList(0, "", "[EXPRESSION]\t[ALIAS_SEP] [CX_COL_NAME]", ",\n\t", "", ""))%>; 
$> 

只有把"到Java的JBS换人内文字的方式是contatenation与字符文字'"'或使用'"'.toString()表达式如果不可能使用Char类型。

FINALLY:

在最后JBS代码,你可以使用\",但换人内只有+'"'+

+0

将双引号连接为一个字符指向正确的方向。我的情况有所改变,实际上我不得不在字符内部加双引号,比如'\''。我真的不喜欢ODI如何处理这个问题 - 有时候模板感觉像是在一条腿上拍摄自己的感觉 – mayr

+0

单引号是所以只有一个符号可以出现在内部,例如''X''是正确的,但'AB'是错误的。如果你使用'''',那么它就等于''''' (没有反斜杠),就像上面解释的那样ODI在JBS替换中“吃”了反斜杠 它发生在源代码处理中 ODI总是将所有东西都翻译成JBS代码,再次打印代码,然后真正执行代码。 –