0

我在 ODI 中有一个存储过程,它直接连接到数据库内的 pl sql 存储过程。存储运行正常。执行存储过程后,如何检索输出变量“var_esito”的值?

在此处输入图像描述

4

1 回答 1

0

这取决于您希望如何使用接收到的值。无论如何,您在 ODI 程序中需要两个任务:

Task1--------------------------------------
Target:                      Source:
                             declare
                               var_esito varchar2(100);
                             begin
                               oms_upd_code_stato('','',var_esito);
                               dbms_session.set_context('clientcontext',
                                 'var_esito', var_esito);
                             end;
Task2---------------------------------------
Target:                      Source:
begin                        select sys_context('clientcontext', 'var_esito') VAR_ESITO
/*do smth with #VAR_ESITO*/  from dual  
end;

第一个任务调用过程并将值存储在会话上下文中。第二个任务获取该值并将其用于在相同或其他数据库上执行的其他 PL/SQL 块中。

也可以将值分配给 java 变量:

Target:
<@
  String var_esito = "#VAR_ESITO";
@>

然后可以通过以下方式在会话期间的任何地方使用此 java 变量(包括 ODI 变量分配):

<@=var_esito@>

Oracle 12c 更新

如果源数据库是 12c,您可以使用 WITH 子句增强功能并从过程中创建一个函数,并立即获得结果

WITH
  FUNCTION func1(... args ...) RETURN VARCHAR2 IS
    var_esito varchar2(100);
  BEGIN
    oms_upd_code_stato('','',var_esito); -- your procedure
    RETURN var_esito;
  END;
SELECT func1(....) as VAR_ESITO FROM DUAL;

现在我们再次可以在目标代码中使用#VAR_ESITO或。:VAR_ESITO因此,在 Oracle 12c 中,普通SELECT用户可以轻松调用存储过程并通过 out-arguments 传递返回值。

于 2017-07-20T14:29:27.343 回答