Как вызвать хранимую процедуру 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:-
У меня есть другое решение, в котором вы можете использовать действие копирования с функцией предварительного копирования приемника, несмотря на активность поиска.
Для этого подхода просто выполните следующие шаги: -
- Сохраните как исходную таблицу, так и таблицу приемника одинаковыми (скажем, таблицу A), используя одну и ту же связанную службу.
- В приемнике используйте функцию сценария предварительного копирования и сохраните запрос DML (Insert/Update/Delete), который вы хотите выполнить над таблицей B.(Эта таблица не обязательно должна быть такой же, как таблица A)
- Если вы хотите избежать копирования данных в ту же таблицу, вы можете выбрать параметр запроса в исходной части и предоставить предложение where, которое не будет удовлетворять, и, следовательно, копирование данных не произойдет. или вы можете создать временную таблицу с одним столбцом и одной строкой. Я протестировал оба варианта, и он работает ... Хорошая часть вышеуказанного решения заключается в том, что вы можете избежать создания и обслуживания процедуры или функции.