Oracle ODI:使用知识模块创建具有动态名称的表

时间:2013-01-09 16:11:49

标签: oracle

我需要使用加载知识模块(LKM)在Oracle中创建审核表。

知识模块通常会创建动态命名的各种表,触发器和视图,例如:C $ _tablename,J $ _tablename,T $ _tablename,JV $ _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数据库中创建具有动态名称的类似表?

谢谢。

2 个答案:

答案 0 :(得分:0)

我设法解决了这个问题。

<%=odiRef.getTable("L", "TARG_NAME", "A")%>以DATABASE。“tablename”格式返回目标表名。

因此我向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\"'

但是,由于无法在ODI中的SQL脚本中使用Jython变量,因此我向LKM添加了另一个步骤,即使用ODI Expert's Jython to Java API将Jython变量提取到Java变量(可由ODI对象使用)。

import api.getInfo as info;

info.setJythonVariable(JYTHON_AUDIT_TABLE);

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

然后,我可以轻松地在我的SQL脚本中使用JAVA_AUDIT_TABLE变量在目标数据库中创建所需的表。

create table <@=JAVA_AUDIT_TABLE@>...

insert into <@=JAVA_AUDIT_TABLE@>...

答案 1 :(得分:0)

我处于类似的情况,但有列。我按照你的步骤,我在设置java变量时遇到错误。我可能没有使用正确的技术或做一些愚蠢的事情。

我在源代码中使用了Java bean shell技术,并使用了您提供的代码片段。

如果您能提供更多信息,例如您在源和目标上使用的技术,那将非常有用。