Запись вывода запроса в .xlsx из хранимой процедуры в SQL Developer - PullRequest
0 голосов
/ 05 апреля 2019

Мне нужно заменить текущий процесс создания процедур в SQL Developer, чтобы записать вывод запроса в CSV, с кодом, который вместо этого выведет файл .xlsx. Я провел небольшое беглое исследование по этой теме, но ответы кажутся мне не по зубам.

Я пытался имитировать решения, найденные в Google / Stack, но безрезультатно.

ПРИМЕР ПРОЦЕДУРЫ CSV:

create or replace PROCEDURE EXAMPLE_FILE_CSV AS
  CURSOR c_data IS
                       ‘QUERY HERE’;

  v_file  UTL_FILE.FILE_TYPE;
BEGIN
  v_file := UTL_FILE.FOPEN(location     => 'EXTRACT_DIR',
                           filename     => 'EXAMPLE_FILE.CSV',
                           open_mode    => 'w',
                           max_linesize => 32767);
  FOR cur_rec IN c_data LOOP
    UTL_FILE.PUT_LINE(v_file,
                      cur_rec.COL1   || ',' ||
                      cur_rec.COL2    || ',' ||
                      cur_rec.COL3      || ',' ||
                      cur_rec.COL4      || ',' ||
                      cur_rec.COL5 || ',' ||
                      cur_rec.COL6    ;
  END LOOP;
  UTL_FILE.FCLOSE(v_file);

EXCEPTION
  WHEN OTHERS THEN
    UTL_FILE.FCLOSE(v_file);
    RAISE;
END;

Ответы [ 2 ]

0 голосов
/ 09 апреля 2019

упомянутое требование выполнимо при использовании кодирования «xls» через plsql. Проще говоря, мы используем plsql для генерации xls-кода в соответствии с необходимостью и используем его как файл Excel.

базовая кодировка xls для создания файла excel:

<?xml version="1.0"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
 xmlns:o="urn:schemas-microsoft-com:office:office"
 xmlns:x="urn:schemas-microsoft-com:office:excel"
 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
 xmlns:html="http://www.w3.org/TR/REC-html40">
 <Worksheet ss:Name="Sheet1">
  <Table>
   <Row>
    <Cell><Data ss:Type="String">cell data</Data></Cell> 
    .........
   </Row>
   ........
  </Table>
 </Worksheet>
......
</Workbook>

подход состоит в том, чтобы генерировать кодирование со значениями из базы данных соответственно.

пример:

рассмотрим таблицу:

ROLL_NO NAME            AGE
01      student no 1    15

следующий код plsql сгенерирует лист Excel для этой записи таблицы

declare
cursor c1 is select * from student_tbl;
l_xls_code varchar2(4000);
begin
l_xls_code:= CHR(60)||'?xml version='||CHR(34)||'1.0'||CHR(34)||'?'||CHR(62)||CHR(12)||
CHR(60)||'Workbook xmlns='||CHR(34)||'urn:schemas-microsoft-com:office:spreadsheet'||CHR(34)||'
 xmlns:o='||CHR(34)||'urn:schemas-microsoft-com:office:office'||CHR(34)||'
 xmlns:x='||CHR(34)||'urn:schemas-microsoft-com:office:excel'||CHR(34)||'
 xmlns:ss='||CHR(34)||'urn:schemas-microsoft-com:office:spreadsheet'||CHR(34)||'
 xmlns:html='||CHR(34)||'http://www.w3.org/TR/REC-html40'||CHR(34)|| CHR(62) ||
 CHR(60)||'Worksheet ss:Name='||CHR(34)||'Student Data'||CHR(34)|| CHR(62) ||
  CHR(60)||'Table'|| CHR(62)||
   CHR(60)||'Row'|| CHR(62)|| 
    CHR(60)||'Cell'|| CHR(62)||CHR(60)||'Data ss:Type='||CHR(34)||'String'||CHR(34)|| CHR(62)||'Roll No.'||CHR(60)||'/Data'|| CHR(62)|| CHR(60)||'/Cell'|| CHR(62) ||
    CHR(60)||'Cell'|| CHR(62)||CHR(60)||'Data ss:Type='||CHR(34)||'String'||CHR(34)|| CHR(62)||'Name'||CHR(60)||'/Data'|| CHR(62)||CHR(60)||'/Cell'|| CHR(62) ||
    CHR(60)||'Cell'|| CHR(62)||CHR(60)||'Data ss:Type='||CHR(34)||'String'||CHR(34)|| CHR(62)||'Age'||CHR(60)||'/Data'|| CHR(62)||CHR(60)||'/Cell'||CHR(62) ||
   CHR(60) ||'/Row'|| CHR(62);

-- dynamically having values from the table into the excel sheet
For rec in c1
loop
l_xls_code:= l_xls_code||
 CHR(60)||'Row'|| CHR(62)|| 
    CHR(60)||'Cell'|| CHR(62)||CHR(60)||'Data ss:Type='||CHR(34)||'String'||CHR(34)|| CHR(62)||rec.roll_no||CHR(60)||'/Data'|| CHR(62)|| CHR(60)||'/Cell'|| CHR(62) ||
    CHR(60)||'Cell'|| CHR(62)||CHR(60)||'Data ss:Type='||CHR(34)||'String'||CHR(34)|| CHR(62)||rec.name||CHR(60)||'/Data'|| CHR(62)||CHR(60)||'/Cell'|| CHR(62) ||
    CHR(60)||'Cell'|| CHR(62)||CHR(60)||'Data ss:Type='||CHR(34)||'String'||CHR(34)|| CHR(62)||rec.age||CHR(60)||'/Data'|| CHR(62)||CHR(60)||'/Cell'||CHR(62) ||
   CHR(60) ||'/Row'|| CHR(62);
end loop;



l_xls_code:= l_xls_code|| CHR(60)||'/Table'||CHR(62) ||
 CHR(60)||'/Worksheet'||CHR(62)|| 
CHR(60)||'/Workbook'||CHR(62);


dbms_output.put_line(l_xls_code);

end;

вышеуказанный код отображает вывод. это будет кодировка xml, которая может быть сохранена в файле в формате .xls откроется только через лист Excel

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

обычно эта переменная будет переменной clob, lob (как в сценариях реального времени, эта кодировка xml будет довольно большой), которую можно отправить как вложение или создать файл в расположении сервера.

аналогичный метод может быть реализован с помощью сценариев Unix - чтобы иметь кодировку xls, сгенерированную сеансом sql согласно требованиям, и помещать их в файл

0 голосов
/ 05 апреля 2019

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

Поскольку вы упоминаете, что в настоящее время вы выполняете запросы вручную, скопируйте / прошлый (?) В Excel, UTL_FILEопция вам не поможет.

Теперь, чтобы поместить эти данные запроса в локальные файлы / файлы на стороне клиента, этот подход может помочь вам начать работу - напишите скрипт, который выполняется в SQLPlus / SQLDeveloper, и выведите CSV * 1006.* файл, используя следующее в качестве шаблона / примера.Формат XLSX сложнее.

myscript.sql:

SET LINES 2000
SET PAGES 0
SET TRIMSPOOL ON
SPOOL the_output.csv
SELECT col1 || ',' ||
       col2 || ',' ||
       col3 || ',' ||
       col4 || ',' ||
       col5 || ',' ||
       col6
FROM the_table
WHERE ...;
SPOOL OFF

Другой вариант, который у вас есть, это использовать DBMS_OUTPUT.PUT_LINE следующим образом:

create or replace PROCEDURE EXAMPLE_FILE_CSV AS
  CURSOR c_data IS
SELECT col1,
       col2,
       col3,
       col4,
       col5,
       col6
FROM the_table
WHERE ...;
    BEGIN
      FOR cur_rec IN c_data LOOP
        DMBS_OUTPUT.PUT_LINE(
                          cur_rec.COL1   || ',' ||
                          cur_rec.COL2    || ',' ||
                          cur_rec.COL3      || ',' ||
                          cur_rec.COL4      || ',' ||
                          cur_rec.COL5 || ',' ||
                          cur_rec.COL6    ;
      END LOOP;
    END;
    /

Чтобы вызвать это, выбудет делать следующее в скрипте вызывающего абонента:

SET SERVEROUTPUT ON
SET VERIFY OFF
SET LINES 2000
SET TRIMSPOOL OFF
SPOOL the_output.csv
EXEC EXAMPLE_FILE_CSV;
SPOOL OFF;
...