экспортировать данные из набора таблиц в Oracle - PullRequest
0 голосов
/ 18 апреля 2020

У меня есть сценарий использования, когда в наборе хранимых процедур вызывается (с использованием планировщика), который состоит из следующего шаблона работы -

  1. Установите некоторые переменные, такие как текущая дата приложения и c. [Done]
  2. Выполнение запросов к таблицам БД для заполнения глобальных временных таблиц в соответствии с пользовательскими случаями [Done]
  3. Экспорт этих результатов в соответствии со случаем отчета (с использованием условия where для временных таблиц) в формате файла CSV [Нужна помощь]
  4. Каталог файлов CSV основан на типе отчета, а имя файла CSV - Dynami c в зависимости от дня / времени. [Нужна помощь]

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

Я попробовал функциональность SPOOL, но похоже, что она основана на SQLPLUS и не уверен, сможем ли мы использовать ее в хранимой процедуре, В любом случае мы можем использовать его в этом потоке в хранимой процедуре. Если нет - каковы возможные варианты вызова SPOOL в Oracle 19 c? Если это так - данные временной таблицы будут доступны, поскольку мы поняли, что это только на уровне сеанса. Пожалуйста, дайте нам знать, если у вас есть какие-либо обходные пути для того же.

set term off
set feed off
set feedback off
set sqlformat csv
spool 'D:\test\outputExample.csv'
select Date_Time,a,b,c,Net_Amount from temp_tbl1 ;
spool off

Поскольку объем данных для каждого отчета CSV находится на более высокой стороне, я избегаю использования utl_file функциональности. Есть ли в Oracle 19 c какие-либо функции для того же?

Спасибо

1 Ответ

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

SPOOL - это функция SQL Plus, вы не можете использовать ее внутри PL / SQL. Многие инструменты, такие как SQL Developer et c. поддержка команд sqlplus. Сказав это, вам нужно вызвать все процедуры и вызвать sqlplus на уровне ОС. Если вы хотите записать вывод процедуры в файл ОС, тогда вы можете использовать UTL_FILE. Если вы хотите избежать этого, то единственный способ - использовать DBMS_OUTPUT внутри ваших процедур, а затем буферизовать вывод в файл.

Начиная с Oracle 12.2 и далее, вы можете использовать Команда SET MARKUP :

SET MARKUP CSV ON

Синтаксис SET MARKUP имеет две опции:

  • CSV
  • HTML

Параметр CSV имеет следующий синтаксис:

CSV {ON|OFF} [DELIMI[TER] character] [QUOTE {ON|OFF}]

См. Документацию SQLPlus для создания CSV сообщает .

Альтернативное решение UTL_FILE:

Вы можете использовать DBMS_SCHEDULER, чтобы создать задание для сценария SQL. В последних версиях планировщик базы данных был усовершенствован, чтобы можно было запускать сценарии стиля SQL Plus непосредственно из базы данных без необходимости предоставления ОС доступа к серверу базы данных или исполняемому файлу SQL* Plus.

Например:

declare
  sql_script   VARCHAR2(32767) :=
  'conn /@db
  set markup csv on
  set pages 0
  set lines 200
  set trimspool on
  spool c:\your_directory\file.csv
  select * from tab;
  spool off';
begin
 dbms_scheduler.create_job(
   job_name        => 'UNLOAD_DATA',
   job_type        => 'SQL_SCRIPT',
   job_action      => sql_script,
   credential_name => 'username',
   enabled         => true
   );
end;
/

Вы можете расширить и реализовать приведенный выше пример для ваших сложных процедур. Вот хорошее объяснение здесь .

...