Как создать файл спула скрипта oracle sql

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

  whenever sqlerror exit failure rollback
  set heading off
  set arraysize 1
  set newpage 0
  set pages 0
  set feedback off
  set echo off
  set verify off

 declare
 ab varchar2(10) := 'Raj';
 cd varchar2(10);
 a number := 10;
 c number;
 d number;
 begin
 c := a+10;
 select ab,c into cd,d from dual;
 end;

 SPOOL 
 select cd,d from dual;
 SPOOL OFF
 EXIT;

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

Спасибо.


person user987900    schedule 21.12.2011    source источник


Ответы (4)


Это приведет к буферизации вывода из анонимного блока в файл с именем output_<YYYYMMDD>.txt, расположенный в корне локального ПК на диске C:, где <YYYYMMDD> — текущая дата:

SET SERVEROUTPUT ON FORMAT WRAPPED
SET VERIFY OFF

SET FEEDBACK OFF
SET TERMOUT OFF

column date_column new_value today_var
select to_char(sysdate, 'yyyymmdd') date_column
  from dual
/
DBMS_OUTPUT.ENABLE(1000000);

SPOOL C:\output_&today_var..txt

DECLARE
   ab varchar2(10) := 'Raj';
   cd varchar2(10);
   a  number := 10;
   c  number;
   d  number; 
BEGIN
   c := a+10;
   --
   SELECT ab, c 
     INTO cd, d 
     FROM dual;
   --
   DBMS_OUTPUT.put_line('cd: '||cd);
   DBMS_OUTPUT.put_line('d: '||d);
END; 

SPOOL OFF

SET TERMOUT ON
SET FEEDBACK ON
SET VERIFY ON

PROMPT
PROMPT Done, please see file C:\output_&today_var..txt
PROMPT

Надеюсь, поможет...

РЕДАКТИРОВАТЬ:

После вашего комментария вывести значение для каждой итерации курсора (я понимаю, что в этом примере каждое значение будет одинаковым, но вы должны понять суть того, что я делаю):

BEGIN
   c := a+10;
   --
   FOR i IN 1 .. 10
   LOOP
      c := a+10;
      -- Output the value of C
      DBMS_OUTPUT.put_line('c: '||c);
   END LOOP;
   --
END; 
person Ollie    schedule 21.12.2011
comment
Что произойдет, если в блоке есть курсор, и он зацикливается внутри начала-конца. Например, цикл c := a+10; выберите c в: d из двойного; конечная петля; конец; SPOOL выберите :d из двойного; КАТУШКА ВЫХОД;' Итак, теперь он выдаст все результаты или окончательный вывод, сохраненный в :d. Как намотать, если есть петля. - person user987900; 21.12.2011
comment
Вы можете использовать DBMS_OUTPUT в цикле курсора для вывода значения при каждой итерации курсора. Смотрите редактировать.. - person Ollie; 21.12.2011
comment
Привет, Олли, у меня есть еще один вопрос. Приведенный выше код отлично работает, когда я запускаю SQL * plus. Но у меня есть сценарий оболочки, который вызывает этот сценарий SQL и переводит вывод в текстовый файл. Я зарегистрировал сценарий оболочки в приложениях Oracle, и когда я отправляю запрос из приложений на запуск. Он показывает нормально и работает, но никогда не завершается. Я должен внести какие-либо изменения в приведенный выше сценарий при вызове из сценария оболочки. - person user987900; 10.01.2012
comment
Если вы запускаете его в фоновом режиме, я бы беспокоился о том, куда вы ожидаете получить результат. В этих обстоятельствах вам может быть лучше использовать пакет UTL_FILE для записи вывода в файл непосредственно из блока PL/SQL, затем вы можете прочитать этот файл с помощью любого инструмента (PL/SQL, Java, UNIX и т. д.). ). это довольно просто сделать, и у вас будет меньше сложностей, чем буферизация вывода через SQLPlus, а затем в сценарий оболочки и т. д. docs.oracle.com/cd/B19306_01/appdev.102/b14258/u_file.htm - person Ollie; 10.01.2012
comment
Чтобы запустить это из сценария в SQL Plus (например, @myscript.sql), мне пришлось добавить / после END; Анонимного блока. - person Dzyann; 03.06.2015
comment
У кого-нибудь есть супер простой пример катушки? Я просто хочу экспортировать однострочную таблицу, но мне придется делать один и тот же экспорт несколько раз, поэтому я бы хотел не использовать (щелчок правой кнопкой мыши -> экспорт ...) каждый раз. Я не могу найти пример, который не включает 30+ строк кода. - person J.Dahlgren; 16.07.2018

С катушкой:

  set heading off
  set arraysize 1
  set newpage 0
  set pages 0
  set feedback off
  set echo off
  set verify off

variable cd varchar2(10);
variable d number;

 declare
 ab varchar2(10) := 'Raj';
 a number := 10;
 c number;
 begin
 c := a+10;
 select ab,c into :cd,:d from dual;
 end;

 SPOOL 
 select :cd,:d from dual;
 SPOOL OFF
 EXIT;
person Florin Ghita    schedule 21.12.2011
comment
Что произойдет, если в блоке есть курсор, и он зацикливается внутри начала-конца. Например, цикл c := a+10; выберите c в: d из двойного; конечная петля; конец; SPOOL выберите :d из двойного; КАТУШКА ВЫХОД;' Итак, теперь он выдаст все результаты или окончательный вывод, сохраненный в :d. Как намотать, если есть петля. - person user987900; 21.12.2011
comment
Не будет работать таким образом. Вы можете буферизовать выборки SQL, а не PL/SQL. Для вывода в коде pl/sql вы можете использовать пакет dbms_output, как указал Олли. - person Florin Ghita; 22.12.2011

Намотать из блока BEGIN END довольно просто. Например, если вам нужно спулировать результат из двух таблиц в файл, просто используйте функцию for loop. Пример кода приведен ниже.

BEGIN

FOR x IN 
(
    SELECT COLUMN1,COLUMN2 FROM TABLE1
    UNION ALL
    SELECT COLUMN1,COLUMN2 FROM TABLEB
)    
LOOP
    dbms_output.put_line(x.COLUMN1 || '|' || x.COLUMN2);
END LOOP;

END;
/
person Sarath KS    schedule 21.08.2017

Чтобы выполнить файл спула в plsql, перейдите в Файл->Создать->окно команд -> вставьте свой код->выполнить. Перешел в каталог, и вы найдете файл.

person sweety    schedule 20.06.2012