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

时间:2019-08-22 22:29:49

标签: oracle-data-integrator

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

我尝试创建一个ODI过程,并在其中使用。(返回变量)创建一个名为db包的过程。

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

2 个答案:

答案 0 :(得分:0)

如果您的目标是将该函数返回的值存储到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;

答案 1 :(得分:0)

由于这是对函数的调用,因此必须在ODI过程中创建一个变量,该函数将值返回到该变量。 所以我做了一个小小的改动,它就起作用了。

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