У меня есть файл размером 450 МБ, и я хочу вставить его в столбец Blob в таблице Oracle. Я попытался вставить содержимое файла как строку, но он говорит, что «строковый литерал слишком длинный». Кто-нибудь может предложить элегантный способ вставки в таблицу. При условии: у меня нет доступа к каталогу на сервере базы данных, у меня есть файл xml в моей локальной системеВставьте большой файл xml как blob в таблицу oracle
ответ
Вы можете преобразовать xml-файл в скрипт sql, выполнив соответствующий анонимный блок PLSQL. Загрузка этого скрипта в db будет заполнять blob.
Основная идея состоит в том, чтобы разбить файл xml на куски 2000 символов. Первый фрагмент может быть непосредственно вставлен в столбец blob целевой таблицы. Каждый другой будет добавлен оператором обновления, использующим процедуру пакета dbms_lob.fragment_insert
. !!! ПРЕДУПРЕЖДЕНИЕ: Это не рекомендуется!. Лучше получите dba, чтобы загрузить его для вас!
Пример:
Предположения:
- Целевая таблица имеет 2 колонки, рК и BLOB.
- pk is 42.
- 2000 - размер образца, считающийся подходящим. Технически,
dbms_lob.fragment_insert
обрабатывает до 32767, однако другие задействованные инструменты (например, sqlplus) могут иметь более жесткие ограничения на длину строки.
Код:
declare l_b BLOB; begin insert into t_target (c_pk, c_blob) values (42, utl_raw.cast_to_raw('<This literal contains the first 2000 (chunksize) characters of the xml file>')) returning c_blob into l_b ; dbms_lob.fragment_insert (l_b, 2000, 1+dbms_lob.getlength(l_b), utl_raw.cast_to_raw('<This literal contains 2000 characters starting at [0-based] offset 2000>')); dbms_lob.fragment_insert (l_b, 2000, 1+dbms_lob.getlength(l_b), utl_raw.cast_to_raw('<This literal contains 2000 characters starting at [0-based] offset 4000>')); dbms_lob.fragment_insert (l_b, 2000, 1+dbms_lob.getlength(l_b), utl_raw.cast_to_raw('<This literal contains 2000 characters starting at [0-based] offset 6000>')); ... dbms_lob.fragment_insert (l_b, 2000, 1+dbms_lob.getlength(l_b), utl_raw.cast_to_raw('<This literal contains the last chunk>')); commit; end; / show err
Подготовительные работы
Вы должны убедиться, что ни одна цитата не происходит внутри вашего файла XML. В противном случае сгенерированный код PLSQL будет содержать синтаксические ошибки.
Если одинарные кавычки не используются в качестве разделителей значений атрибутов, просто замените их на числовой объект
&x#28;
.Создать большую часть анонимного PLSQL
методы для вставки данных в файл через регулярные промежутки времени представлены в this SO question, наиболее гибкий подход намечаются in this answer. Вместо того, чтобы символы новой строки, вставьте следующую строку, вставленный:
"'));\n dbms_lob.fragment_insert (l_b, 2000, 1+dbms_lob.getlength(l_b), utl_raw.cast_to_raw('"
Остальная часть анонимного PLSQL могут быть скопированы/написанный вручную.
Caveat
как есть, размер сценария будет иметь такую же величину, что и исходный XML и блок PLSQL будет содержать 200k + строк. Скорее всего, вы столкнетесь с некоторыми ограничениями задействованных инструментов. Тем не менее, этот сценарий может быть разбит на произвольное число кусков следующим образом:
declare
l_b BLOB;
begin
select c_blob
into l_b
from t_target
where c_pk = 42
;
dbms_lob.fragment_insert (l_b, 2000, 1+dbms_lob.getlength(l_b), utl_raw.cast_to_raw('<This literal contains 2000 characters starting at [0-based] offset <k>*2000>'));
dbms_lob.fragment_insert (l_b, 2000, 1+dbms_lob.getlength(l_b), utl_raw.cast_to_raw('<This literal contains 2000 characters starting at [0-based] offset (<k>+1)*2000>'));
dbms_lob.fragment_insert (l_b, 2000, 1+dbms_lob.getlength(l_b), utl_raw.cast_to_raw('<This literal contains 2000 characters starting at [0-based] offset (<k>+2)*2000>'));
...
dbms_lob.fragment_insert (l_b, 2000, 1+dbms_lob.getlength(l_b), utl_raw.cast_to_raw('<This literal contains 2000 characters starting at [0-based] offset (<k>+<n_k>)*2000>'));
end;
/
show err
И еще раз: !!! ПРЕДУПРЕЖДЕНИЕ: Это не рекомендуется!. Лучше получите dba, чтобы загрузить его для вас!
Как насчет написания небольшой программы на любых языках, которая умеет читать файл и вставлять запрос в таблицу.
Это звучит проще всего. Программу можно выполнить с помощью PLSQL непосредственно в базе данных Oracle. Но это может потребовать работы. –
Я имел в виду другие языки - java, python ... Не стоит тратить больше часа –
Предположим, вы немного ищете и натыкаетесь на search result: вы найдете страницу с кодом PL/SQL.
CREATE OR REPLACE DIRECTORY test_dir AS '<path_on_db_server>';
DECLARE
l_bfile BFILE;
l_blob BLOB;
BEGIN
-- this depends on your table definition, col1 being the BLOB column
INSERT INTO tab1 (col1, col2) VALUES (empty_blob(), 'test1')
RETURN col1 INTO l_blob;
l_bfile := BFILENAME('test_dir', 'my.xml');
DBMS_LOB.fileopen(l_bfile, Dbms_Lob.File_Readonly);
DBMS_LOB.loadfromfile(l_blob, l_bfile, DBMS_LOB.getlength(l_bfile));
DBMS_LOB.fileclose(l_bfile);
COMMIT;
END;
Тогда вы попробуете его (после того, как вы поместите файл test.xml
на сервере в <path_on_db_server>
и заверил, что oracle
пользователь имеет доступ к файлу).
- 1. Вставьте ArrayList в таблицу Oracle
- 2. Большой файл blob в Javascript
- 3. Запись BLOB в XML файл
- 4. конвертировать oracle blob в xml тип
- 5. Как вставить большой гексагон в колонку BLOB?
- 6. Вставка значений BLOB (xml) в Oracle DB
- 7. Как создать таблицу из файла XML, хранящегося в формате BLOB?
- 8. Вставьте таблицу Excel в таблицу Oracle, используя инструкцию SQL
- 9. Извлечение XML в таблицу Oracle
- 10. Как обновить большой файл XML
- 11. Как просмотреть файл BLOB из oracle db
- 12. создать большой файл xml
- 13. Чтение большой XML-файл
- 14. RE: Большой файл XML
- 15. Как скрыть большой файл JSON в XML?
- 16. Как преобразовать большой json-файл в xml
- 17. Как разбирать большой XML-файл в python?
- 18. Вставка XML в таблицу Oracle дает файл не найдена ошибка
- 19. Oracle BLOB vs VARCHAR
- 20. Как загрузить большой XML-файл (> 100 МБ) в столбец XMLType в Oracle
- 21. Как импортировать файл в таблицу oracle
- 22. Вставьте файл csv в Azure SQL из Azure Blob
- 23. ORACLE BLOB к файлу
- 24. Вставьте утверждения в Oracle
- 25. Процесс очень большой XML-файл
- 26. Вставьте данные в таблицу из таблицы anothe в Oracle
- 27. Разделите строку oracle в один столбец и вставьте в таблицу
- 28. загрузка xml файла в таблицу oracle
- 29. Вставьте DataRow в таблицу
- 30. Обновление BLOB в Oracle
Используйте http://blogs.perficient.com/delivery/blog/2012/05/29/insert-a-long-xml-string-to-db-table-with-plsql/ –