2017-06-29 55 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代碼,再次打印代碼,然後真正執行代碼。 –