Каков наиболее эффективный способ загрузки двоичного (BLOB) контента только с помощью sqlplus? - PullRequest
3 голосов
/ 21 января 2020

Мой пример использования - доставка и установка бинарных файлов в Oracle таблицы. Файлы доступны локально на моем сайте и должны быть установлены на нескольких клиентских сайтах только с использованием sqlplus. В настоящее время я делаю это локально, используя скрипт Python, который загружает файлы и затем генерирует скрипт sql с блоками, подобными следующему. Затем сценарии распространяются среди клиентов и запускаются с использованием sqlplus.

Этот метод работает, но имеет следующие недостатки:

  • сценарии sql могут быть очень большими, если их много и / или большие двоичные файлы должны быть загружены
  • запуск сценариев sql может быть довольно медленным, если и / или необходимо загружать двоичные файлы

Мне было интересно, если кто-то подошел с лучшим решением или теперь как это улучшить?

пример. sql

DECLARE
    l BLOB;
    PROCEDURE i(t IN VARCHAR2) IS BEGIN dbms_lob.append(l, utl_encode.base64_decode(utl_raw.cast_to_raw(t))); END i;
BEGIN
    dbms_lob.createtemporary(lob_loc=>l, cache=>FALSE, dur=>dbms_lob.session);
    i('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');
    i('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');
    INSERT INTO BinaryResources (filename, mimeType, content) VALUES ('DOC.JPG', 'image/jpeg', l);
    dbms_lob.freetemporary(lob_loc=>l);
END;
/

1 Ответ

0 голосов
/ 21 января 2020

Ваш python скрипт должен установить соединение с Oracle экземпляром. Затем ваш скрипт python может проанализировать (т.е. подготовить) текст оператора SQL INSERT INTO BinaryResources (filename, mimeType, content) VALUES (?, ?, ?).

Затем вы привязываете значения-заполнители к курсору (строка, строка, большой двоичный объект). Вы создаете BLOB-объект с любыми предоставляемыми функциями поставщика python - Oracle.

Используйте метод execute для вставки массива после заполнения массива размером не менее 2-4k.

...