我的要求是将数据从Oracle复制到SQL Server。从Oracle数据库复制之前,我需要使用具有一定逻辑的过程来更新Oracle表。
如何从Azure数据工厂执行Oracle存储过程?
我推荐了to this thread
如果我在EXECUTE PROC_NAME (PARAM);
脚本中使用preCopy
,则失败,并显示以下错误
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
有人可以帮忙吗?
注意:我使用的是数据工厂的自托管运行时环境 谢谢!
答案 0 :(得分:1)
我使用了查找活动和 DUAL TABLE 的 SELECT 语句。由于存储过程不能从语句 SELECT 中调用。我创建了一个 oracle 函数,该函数调用了存储过程。该函数返回一个值,该值由查找活动接收。 定义函数时,必须添加语句 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;
这是西班牙语的示例。 https://dev.to/maritzag/ejecutar-un-stored-procedure-de-oracle-desde-data-factory-2jcp
答案 1 :(得分:0)
在Oracle中,EXECUTE X(Y)
是PL / SQL语句BEGIN X(Y); END;
的特定于SQL * Plus的命令快捷方式。由于您没有使用SQL * Plus,请尝试使用BEGIN / END语法。
答案 2 :(得分:-1)
如果您只想使用 Azure 数据工厂执行 DML 查询而无需在 oracle 数据库上执行:-
我有另一种解决方案,您可以将复制活动与接收器的预复制功能一起使用,尽管存在查找活动。
对于这种方法,只需按照以下步骤操作:-