Может ли программа Oracle возвращать результаты из глобальной временной таблицы - PullRequest
0 голосов
/ 19 апреля 2011

Вот фрагмент кода Oracle, который я пытаюсь адаптировать. Я сократил все детали:

    declare  
    begin  
      loop  
      --do stuff to populate a global temporary table.  I'll call it 'TempTable'  
      end loop;  
    end; 
    /

   Select * from TempTable

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

Можно ли объединить две части, чтобы я мог заполнить глобальную временную таблицу и получить результаты всего за один шаг?

Заранее спасибо!

Ответы [ 3 ]

1 голос
/ 19 апреля 2011

Ну, для меня это зависит от того, как я буду видеть шаги.Вы делаете команду PL / SQL и SQL.Я бы предпочел ввести их в файл и запустить их одной командой (если бы это можно было назвать одним шагом для вас) ...

Что-то вроде

file.sql

begin  
 loop  
 --do stuff to populate a global temporary table.  I'll call it 'TempTable'  
 end loop;  
end; 
/
Select * 
from TempTable
/

И запустите его как:

prompt> sqlplus /@db @file.sql

Если вы дадите нам больше деталей, например, как вы заполняете GTT, возможно, мы найдем способ сделать это за один шаг.*

0 голосов
/ 19 апреля 2011

В оракуле дополнительная таблица для хранения промежуточных результатов очень редко нужна. Это может помочь сделать вещи проще для понимания. Когда вы можете написать SQL для заполнения промежуточной таблицы, вы, безусловно, можете запросить строки за один шаг, не тратя времени на заполнение GTT. Если вы используете pl / sql для заполнения GTT, посмотрите, можно ли исправить это как чистый SQL. Это почти наверняка даст вам выигрыш в производительности.

0 голосов
/ 19 апреля 2011

Да, но это не тривиально.

create global temporary table my_gtt
 ( ...  )
on commit preserve rows;

create or replace type my_gtt_rowtype as object
  ( [columns definition] )
/

create or replace type my_gtt_tabtype as table of my_gtt_rowtype
/

create or replace function pipe_rows_from_gtt
  return my_gtt_tabtype 
  pipelined
is
  pragma autonomous_transaction;
  type rc_type is refcursor;
  my_rc rc_type;
  my_output_rec my_gtt_rectype := my_gtt_rectype ([nulls for each attribute]);
begin
  delete from my_gtt;
  insert into my_gtt ...
  commit;
  open my_rc for select * from my_gtt;

  loop
    fetch my_rc into my_output_rec.attribute1, my_output_rec.attribute1, etc;
    exit when my_rc%notfound;
    pipe_row (my_output_rec);
  end loop;
  close my_rc;
  return;
end;
/

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

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

...