Экспорт данных в формате XSV из oracle - PullRequest
0 голосов
/ 10 апреля 2020

Я хочу экспортировать некоторые данные (например, результаты некоторых запросов) из старой базы данных oracle в файл, значения которых разделены указанным символом или последовательностью символов. Файл CSV является примером.

Только целые числа, varchars (без перевода строки), даты, другие базовые c значения (?) В результирующем наборе, так что нет больших объектов или других интересных вещей. Просто простые данные, НИКАКОЙ ДОБАВКИ, НИКАКОЙ ОБОРОТЫ, поля, разделенные и, возможно, закрытые.

Практически, я ищу простой "ВЫБРАТЬ ... В АУТФИЛЬНЫЕ ПОЛЯ, ЗАПРЕЩЕНЫ ... char '"из mysql, но для Oracle.

Я пытался использовать sqlplus, но любая программа должна быть в порядке, если она работает на консоли linux и не основана на java : -P.

К сожалению, я не могу использовать "SET SQLFORMAT csv", кажется, что он не поддерживается.

Пока у меня есть лучшие результаты с чем-то вроде:

printf "set echo off newpage 0 size page 0 arraysize 5000 feed off off тримспул при обрезке по \ nselect field1 || '|' || field2 из таблицы; " | sqlplus -S database> output_file

Установка размера массива 5000 (максимум) обеспечивает наилучшую производительность, к сожалению, переносит результат, если строки длиннее 80 символов.

Установка размера строки 30000 (или даже 32767) отменяет упаковка, к сожалению, производительность становится ужасной. Я не хочу указывать максимальный размер строки для каждого запроса (вычисляя максимальный размер для каждого поля в результате), надеясь, что производительность повысится.

После прочтения множества ответов я все еще не могу приблизиться к решение, которое должно быть одновременно ПРАВИЛЬНЫМ и ИСПОЛНИТЕЛЬНЫМ. Мой следующий вызов будет записывать файл php для выполнения этой работы, но это бессмыслица, ИМХО использование приложения по умолчанию, sqlplus, должно дать лучшие результаты ...

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 10 апреля 2020

Хорошо, для всех, у кого была эта проблема, вот ответ:

Убедитесь, что у вас установлен хотя бы oracle клиент 12.2. Если нет, вы можете извлечь файлы из InstantClient-Basi c - linux .x64-12.2.0.1.0.zip (файлы библиотеки) и из JAR-архивов из связанных с sqlplus каталогов из linuxx64_12201_client.zip (client / stage / Компоненты / oracle .sqlplus *). Эти два почтовых индекса доступны для бесплатного скачивания (требуется регистрация) на сайте oracle. Я не хотел устанавливать эту версию клиента, потому что она могла смешаться с локальной установленной. Это своего рода уродливый хак, но по крайней мере ни один файл в системе не был изменен.

Начиная с 12.2, поддерживается команда "set markup csv", и команда была: printf "set head off \ nset feedback off \ nset arraysize 5000 \ nВыберите field1, field2 из таблицы; " | LD_LIBRARY_PATH = / путь / к / oracle12 / lib ORACLE_HOME = / путь / к / oracle12 / путь / к / oracle12 / bin / sqlplus -M "CSV ON" -S база данных

настроить переменную массива (5000 максимальный и быстрый, но обратите внимание на память), выберите параметры «SET MARKUP CSV {ON | OFF} [DELIMI [TER] символ] [QUOTE {ON | OFF}]» и наслаждайтесь

0 голосов
/ 10 апреля 2020

Я не могу сказать, поможет ли этот набор команд SET (обычно я его использую), но - попробуйте.

set termout off 
set trimspool on 
set echo off 
set verify off 
set autoprint off 
set serveroutput off 
set arraysize 1000 
set pagesize 0
set linesize 100
set long 10000
set numwidth 10
set feedback off
set colsep ';'

col empno format 99999
col ename format a10
col sal format 999G990

spool emp.txt
select empno, ename, sal from emp;
spool off

Внизу вы можете увидеть некоторые COL форматирование; удалите его, если он вам не нужен.

Не устанавливайте размер строки на такое большое число (30.000), если оно вам действительно не нужно.

Кроме того, есть set colsep ';' который разделяет столбцы этим разделителем (точка с запятой в этом примере; может быть любым другим символом, например, |, который вы упомянули).

Для ускорения буферизации:

  • установить отключение
  • установить тримпул на
  • запустить его на сервере , а не на клиенте P C
...