Как вызвать хранимую процедуру Oracle из фабрики данных Azure v2

Мое требование - скопировать данные из Oracle на SQL Server. Перед копированием из базы данных Oracle мне нужно обновить таблицу Oracle с помощью процедуры, которая имеет некоторую логику.

Как выполнить хранимую процедуру Oracle из фабрики данных Azure?

Я сослался на эту ветку

если я использую 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

Может ли кто-нибудь помочь в этом?

Примечание: я использую автономную среду выполнения для фабрики данных, спасибо!!

3 ответа

Я использовал действие поиска и оператор SELECT DUAL TABLE. Из-за хранимых процедур невозможно вызвать из оператора SELECT. Я создал функцию оракула, и она вызывает хранимую процедуру. Функция возвращает значение, и это значение получает поисковая активность. При определении функции необходимо добавить оператор PRAGMA AUTONOMOUS_TRANSACTION. Это связано с тем, что Oracle по умолчанию не позволяет выполнять инструкции DML с помощью оператора SELECT. Затем вам нужно определить, что инструкции 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

В Oracle EXECUTE X(Y) - это ярлык для команды PL / SQL, специфичный для SQL*Plus. BEGIN X(Y); END;. Поскольку вы не используете SQL*Plus, попробуйте синтаксис BEGIN/END.

Если вы хотите выполнить только запрос DML с помощью фабрики данных Azure без процедуры в базе данных Oracle:-

У меня есть другое решение, в котором вы можете использовать действие копирования с функцией предварительного копирования приемника, несмотря на активность поиска.

Для этого подхода просто выполните следующие шаги: -

  1. Сохраните как исходную таблицу, так и таблицу приемника одинаковыми (скажем, таблицу A), используя одну и ту же связанную службу.
  2. В приемнике используйте функцию сценария предварительного копирования и сохраните запрос DML (Insert/Update/Delete), который вы хотите выполнить над таблицей B.(Эта таблица не обязательно должна быть такой же, как таблица A)
  3. Если вы хотите избежать копирования данных в ту же таблицу, вы можете выбрать параметр запроса в исходной части и предоставить предложение where, которое не будет удовлетворять, и, следовательно, копирование данных не произойдет. или вы можете создать временную таблицу с одним столбцом и одной строкой. Я протестировал оба варианта, и он работает ... Хорошая часть вышеуказанного решения заключается в том, что вы можете избежать создания и обслуживания процедуры или функции.
Другие вопросы по тегам