如何从Azure数据工厂v2调用Oracle存储过程

db2dz4w8  于 2022-12-03  发布在  Oracle
关注(0)|答案(3)|浏览(198)

我的要求是从Oracle复制数据到SQL Server。在从Oracle数据库复制之前,我需要使用具有一定逻辑的过程更新Oracle表。
如何从Azure数据工厂执行Oracle存储过程?
我引用了to this thread
如果我在preCopy脚本中使用EXECUTE PROC_NAME (PARAM);,它将失败,并显示以下错误

Failure happened on 'Source' side. 
ErrorCode=UserErrorOdbcOperationFailed,
Type=Microsoft.DataTransfer.Common.Shared.HybridDeliveryException
Message=ERROR [42000] [Microsoft][ODBC Oracle Wire Protocol driver]
[Oracle]ORA-00900: invalid SQL statement
Source=Microsoft.DataTransfer.ClientLibrary.Odbc.OdbcConnector,
Type=System.Data.Odbc.OdbcException
Message=ERROR [42000] [Microsoft][ODBC Oracle Wire Protocol driver]
[Oracle]ORA-00900: invalid SQL statement,Source=msora28.dll

有谁能帮忙吗?
注意:我使用的是数据工厂的自托管运行时环境,谢谢!!

tktrz96b

tktrz96b1#

我使用了一个Lookup Activity和一个SELECT语句的DUAL TABLE。由于存储过程不能从SELECT语句中调用。我创建了一个oracle函数,该函数调用存储过程。该函数返回一个值,该值由Lookup Activity接收。在定义函数时,必须添加语句PRAGMA AUTONOMOUS_TRANSACTION。这是因为Oracle在默认情况下不允许使用SELECT语句执行DML指令。然后,您需要定义存储过程中的DML指令将是一个自治事务。

--Tabla
CREATE TABLE empleados(
   emp_id NUMBER(9),
   nombre VARCHAR2(100),
   CONSTRAINT empleados_pk PRIMARY KEY(emp_id),
);

create or replace procedure insert_empleado (numero in NUMBER, nombre in VARCHAR2) is
 begin
    INSERT INTO empleados (emp_id, nombre)
    Values(numero, nombre);
COMMIT;
end;

create or replace function funcinsert_empleado (numero in NUMBER, nombre in VARCHAR2)
return VARCHAR2 
is
PRAGMA AUTONOMOUS_TRANSACTION;
begin
  insert_empleado (numero, nombre);
  return 'done';
end;
--statement in query of lookup
SELECT  funcinsert_empleado ('1', 'Roger Federer') 
FROM DUAL;

Example lookup
这是西班牙语示例https://dev.to/maritzag/ejecutar-un-stored-procedure-de-oracle-desde-data-factory-2jcp

fgw7neuy

fgw7neuy2#

在Oracle中,EXECUTE X(Y)是PL/SQL语句BEGIN X(Y); END;的SQL* Plus特定命令快捷方式。由于您没有使用SQL*Plus,请尝试使用开始/END语法。

jk9hmnmh

jk9hmnmh3#

如果您只想使用Azure数据工厂执行DML查询,而不想在Oracle数据库上执行过程:-

我有另一个解决方案,您可以将复制活动与sink的预复制功能一起使用,而不管查找活动。
对于这种方法,只需按照以下步骤:-
1.使用相同的链接服务,使源表和接收表保持相同(假设表A)。
1.在接收器中,使用预复制脚本功能,并保留要对表B执行的DML(插入/更新/删除)查询。(此表不必与表A相同)
1.如果你想避免数据复制到同一个表,你可以选择查询选项在源部分,并提供一个where子句,这是不会满足,因此不会发生数据复制。或者你可以创建一个表临时与一列和一行。我已经测试了这两个选项,它的工作...上述解决方案的一个优点是可以避免过程或函数的创建和维护。

相关问题