0

我需要使用加载知识模块 (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 中定义的常量,如此处所指定

那么,如何使用知识模块在 Oracle 数据库中创建具有动态名称的类似表?

谢谢你。

4

2 回答 2

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 的 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();
@>

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

create table <@=JAVA_AUDIT_TABLE@>...

insert into <@=JAVA_AUDIT_TABLE@>...
于 2013-01-11T11:12:18.933 回答
0

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

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

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

于 2018-01-16T21:56:34.743 回答