【问题标题】:How to call Oracle stored procedure from azure data factory v2如何从 Azure 数据工厂 v2 调用 Oracle 存储过程
【发布时间】:2020-11-22 01:03:11
【问题描述】:

我的要求是将数据从 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

有人可以帮忙吗?

注意:我正在为数据工厂使用自托管运行时环境 谢谢!!

【问题讨论】:

    标签: oracle stored-procedures azure-data-factory self-hosting copy-activity


    【解决方案1】:

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

    我有另一种解决方案,您可以在其中使用复制活动和接收器的预复制功能,而不管查找活动。

    对于这种方法,只需按照以下步骤操作:-

    1. 使用相同的链接服务保持源表和汇表相同(比如说表 A)。
    2. 在接收器中使用预复制脚本功能并保留要对表 B 执行的 DML(插入/更新/删除)查询。(此表不必与表 A 相同)
    3. 如果您想避免将数据复制到同一个表中,您可以在源部分中选择查询选项并提供一个无法满足的 where 子句,因此不会发生数据复制。 或者您可以创建一列一行的临时表。 我已经测试了这两个选项并且它有效......上述解决方案的一个好处是您可以避免过程或功能的创建和维护。

    【讨论】:

      【解决方案2】:

      我使用了一个查找活动和一个 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;
      

      Example lookup

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-09-25
          • 2018-04-08
          • 1970-01-01
          • 1970-01-01
          • 2019-03-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多