как запускать sql файл с урла в oracle?
достаточно странный вопрос наверное... Попробую сформулировать проще: Предположим у меня есть урл "www.mycite.com/mySqlFile.sql" и там лежит sql скрипт с новыми инсертами, которые мне нужно автоматически заливать к себе в базу каждый день. Есть ли у какого-то варианты как такое можно реализовать? Я понимаю что это нужно делать через job в оракле, но не совсем понимаю как можно вытягивать sql файл с урла... Заранее спасибо!
В добавок: сейчас у меня есть только урл, и ежедневно обновляемый файл с инсертами, пока что приходится запускать инсерты в ручную каждый день
Ответы (1 шт):
За основу взял этот ответ. Необходимо использовать пакет UTL_HTTP. Так как EXECUTE IMMEDIATE работает только со строками придется ограничиться размером файла 32767. Также эта команда не может выполнить несколько SQL-инструкций подряд, поэтому надо использовать PL/SQL блок, он должен быть или в файле или создаваться динамически, как в примере ниже.
Для работы потребуется выдать права ACL для схемы с процедурой.
CREATE OR REPLACE PROCEDURE execute_from_url (p_url IN VARCHAR2) AS
l_http_request UTL_HTTP.req;
l_http_response UTL_HTTP.resp;
l_file varchar2(32767);
BEGIN
-- Make a HTTP request and get the response.
l_http_request := UTL_HTTP.begin_request(p_url);
l_http_response := UTL_HTTP.get_response(l_http_request);
-- Copy the response into the BLOB.
BEGIN
UTL_HTTP.read_text(l_http_response, l_file, 32767);
EXCEPTION
WHEN UTL_HTTP.end_of_body THEN
UTL_HTTP.end_response(l_http_response);
END;
IF l_file IS NOT NULL THEN
EXECUTE IMMEDIATE 'BEGIN ' || l_FILE || 'END;'
END IF;
EXCEPTION
WHEN OTHERS THEN
UTL_HTTP.end_response(l_http_response);
DBMS_LOB.freetemporary(l_file);
RAISE;
END;