Нужны идеи по выводу табличных данных в CSV с использованием PL / SQL в динамическом режиме - PullRequest
2 голосов
/ 26 ноября 2008

Задача состоит в том, чтобы взять список таблиц, который можно изменить.

Напишите фрагмент PL / SQL, который при выполнении выводит строки каждой таблицы в отдельные CSV-файлы.

Так что если 5 таблиц. Вы получите 5 CSV-файлов с соответствующими данными таблицы.

CSV должен быть | разделены и имеют "вокруг каждого значения (для легкого импорта, чтобы преуспеть)

Все, что я знаю, это список таблиц.

Итак, загрузите список в массив в верхней части процедуры, переберите этот список и используйте UTL_FILE для вывода каждой строки построчно.

Я задолбался задаться вопросом, нужен ли мне курсор для каждой таблицы или можно ли динамически использовать курсор для сохранения результатов из каждой таблицы.

p.s. каждый файл также должен содержать заголовки столбцов в качестве первой строки.

Это вообще возможно? Существует список из более 30 таблиц, в некоторых из них более 200 столбцов.

Так что идеи, пожалуйста:).

Я медленно думаю, что это невозможно. так как мне нужен динамический SQL, который может собрать все имена столбцов и т. д., я увязаю!

Это не может быть сценарий SQL и просто спулинг вывода. Все, что мы хотим сделать, это добавить или удалить таблицы из объявления массива.

Ответы [ 3 ]

2 голосов
/ 26 ноября 2008

Да, это возможно. Посмотрите на этот вопрос Тома , который показывает, как это сделать для 1 таблицы за раз. Все, что вам нужно сделать, это перебрать ваш массив имен таблиц и вызвать процедуру Тома для каждого.

1 голос
/ 26 ноября 2008

Сначала Oracle хранит все эти данные в представлениях, к которым у вас есть доступ.

SELECT * FROM ALL_TAB_COLUMNS 

даст вам список столбцов для таблицы. Это упростит создание заголовков столбцов для файла.

Остальное - просто выгрузка данных в плоский файл. Вы можете найти рецепты для этого здесь .

Вот ссылка непосредственно на код .

0 голосов
/ 26 ноября 2008

Есть несколько вариантов.

  1. Вы можете использовать UTL_FILE, чтобы делать дамп предварительно отформатированных текстовых строк в файлы. Просто создайте курсор, который выводит все столбцы данных, объединенные разделителями.

Примерно так:

DECLARE
  TYPE IDCurTyp IS REF CURSOR;
  fo            UTL_FILE.FILE_TYPE;
  varRow        VARCHAR2(4000);
  cur_output    IDCurTyp;
BEGIN
  fo := UTL_FILE.FOPEN('BILLING_DIR','BillingFile1.csv', 'W', 2000)
  OPEN cur_output FOR
    'SELECT ''"'' || t1.col1 || ''",'' || t1.col2 || ''","'' || t1.col2 || ''"'' FROM t1'
  LOOP
    FETCH cur_output INTO varRow;
    EXIT WHEN cur_output%NOTFOUND;
    UTL_FILE.putf( fo, '%s\n', varRow );
  END LOOP;

  CLOSE cur_output;

  UTL_FILE.FCLOSE( fo );
END:
  1. Вместо предварительно отформатированного текста создайте пакет, который принимает запрос SQL, а затем использует пакет DBMS_SQL для его анализа и извлечения имен столбцов и т. Д., А также создает текстовые строки для выгрузки, используя UTL_FILE еще раз.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...