ODI中如何调用数据库包? db 包包含函数列表,其中我只想在 ODI 中调用一个函数

How to call database package in ODI? The db package contains list of functions and out of those I want to call only one function in ODI

有一个数据库包,它包含函数列表。在列表之外,我想调用 ODI12c 中的一个函数。我尝试创建一个 ODI 过程,并在该过程中使用 .(return 变量调用 db 包); 但是,当我执行此 ODI 过程时,它失败并显示错误消息“不是过程或未定义。 任何帮助表示赞赏。 谢谢

我尝试创建一个 ODI 过程并在其中使用 .(return 变量调用 db 包);

错误:不是过程或未定义。

如果您的目标是将该函数返回的值存储到 ODI 变量中,您可以使用类似这样的东西作为该变量的刷新查询:

select <SCHEMA_NAME>.<PACKAGE_NAME>.<FUNCTION_NAME>(<PARAMETERS>) from DUAL;

然后您可以在包或加载计划中刷新该变量。

如果您不需要存储函数的结果而只是执行它,最简单的方法是在您的 ODI 过程中使用 PL/SQL 块。因此,请确保为该过程步骤将技术设置为 Oracle。然后使用这样的东西:

BEGIN
    <SCHEMA_NAME>.<PACKAGE_NAME>.<FUNCTION_NAME>(<PARAMETERS>);
END;

更好的方法是避免对模式名称进行硬编码,而是从拓扑中获取它。由于它可以通过不同的上下文成为不同的模式,我们需要使用 substitution API 来在运行时替换它。这是变量的结果:

select <%=odiRef.getSchemaName("<LOGICAL_SCHEMA_NAME>", "D")%>.<PACKAGE_NAME>.<FUNCTION_NAME>(<PARAMETERS>) from DUAL;

还有一个程序:

BEGIN
    <%=odiRef.getSchemaName("<LOGICAL_SCHEMA_NAME>", "D")%>.<PACKAGE_NAME>.<FUNCTION_NAME>(<PARAMETERS>);
END;

由于这是对函数的调用,因此必须在 ODI 过程中创建一个变量,函数 returns 将其值赋给该变量。 所以我做了一个小改动,它奏效了。

DECLARE 
var1 varchar2(1000);
v_ret Boolean;
BEGIN
     v_ret := <Function Call>;
END;