2013-01-09 70 views
0

我需要創建使用加載知識模塊(LKM)在Oracle中審計表創建具有動態名錶。甲骨文ODI:使用知識模塊

知識模塊通常會創建這些動態命名的,如各種表格,觸發器和視圖:C $ _tablename,J $ _tablename,T $ _tablename,合資$ _tablename,等等,等等

我想這樣做我的審計表類似的東西,即所有審計表將被稱爲「tablename_audit」,但不如何在LKM代碼此設置。

作爲一個例子,下面的LKM的代碼被用於創建C $工作表:

create table <%=odiRef.getTable("L", "COLL_NAME", "A")%> 
(
    <%=odiRef.getColList("", "[CX_COL_NAME]\t[DEST_WRI_DT] NULL", ",\n\t", "","")%> 
) 

而下面的IKM代碼創建一個I $流量表:

create table <%=odiRef.getTable("L", "INT_NAME", "W")%> 
(
    <%=odiRef.getColList("", "[COL_NAME]\t[DEST_WRI_DT] NULL", ",\n\t", "", "")%> 
    ,IND_UPDATE  char(1) 
) 

INT_NAME和COLL_NAME似乎是Substitution API中定義的常量,如指定here

那麼,我該如何使用知識模塊中的Oracle數據庫創建具有動態名稱類似的表?

謝謝。

回答

0

我設法解決這個問題如下。

<%=odiRef.getTable("L", "TARG_NAME", "A")%>返回數據庫中的目標表的名稱。「表名」的格式。

因此,我向LKM添加了一個步驟,它使用Jython從DATABASE中提取表名。「tablename」字符串,將「_audit」附加到表名稱,然後將DATABASE。「tablename_audit」字符串保存到Jython變量,如下所示。

targTableName = '<%=odiRef.getTable("L", "TARG_NAME", "A")%>' 
splitStr = targTableName.split('"') 
JYTHON_AUDIT_TABLE = splitStr[0] + '\"' + splitStr[1] + '_audit\"' 

然而,由於Jython的變量不能從在ODI SQL腳本中使用,我添加另一步驟到我的LKM其取入的Jython變量到Java變量使用ODI Expert's Jython to Java API(其然後可以通過ODI對象使用)。

import api.getInfo as info; 

info.setJythonVariable(JYTHON_AUDIT_TABLE); 

<@ 
import api.getInfo; 
String JAVA_AUDIT_TABLE = getInfo.getJythonVariable(); 
@> 

然後我可以很方便地使用JAVA_AUDIT_TABLE變量在我的SQL腳本來創建我的目標數據庫所需的表。

create table <@[email protected]>... 

insert into <@[email protected]>... 
0

我處於類似的情況,但與列。我遵循你的步驟,並且在設置java變量時出現錯誤。我可能不會使用正確的技術或做一些愚蠢的事情。

我使用的Java豆殼技術在指揮源和使用段,您所提供的代碼。

如果您願意,請提供更多信息,例如您在源代碼和目標代碼中使用的技術。