有一个数据库包,其中包含功能列表。在列表之外,我想在ODI12c中调用一个函数。我试图创建一个ODI过程,并在其中使用。(return variable); 但是,当我执行此ODI过程时,它失败,并显示错误消息“不是过程或未定义。 任何帮助表示赞赏。 谢谢
我尝试创建一个ODI过程,并在其中使用。(返回变量)创建一个名为db包的过程。
错误:不是过程或未定义。
答案 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;