我在 ODI 中有一个存储过程,它直接连接到数据库内的 pl sql 存储过程。存储运行正常。执行存储过程后,如何检索输出变量“var_esito”的值?
3209 次
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 回答