Работа с коллекциями Oracle PL / SQL - PullRequest
1 голос
/ 22 ноября 2011

Цель, которую мне нужно достичь, - собрать все записи из курсора в коллекцию, чтобы заполнить таблицу данными из этого курсора.К сожалению, я не могу понять, как извлечь данные из курсора в массив.Я пробовал с массовым сбором, но нет никакого способа.Что означает ключевое слово extension?

И, наконец, как мне получить данные из этого массива?

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

Ответы [ 2 ]

5 голосов
/ 22 ноября 2011

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

SQL> SQL> SQL> ed
Wrote file afiedt.buf

  1  declare
  2      type r_tmp is record
  3          ( empno number
  4            , deptno number
  5            , sal number );
  6      type nt_emp is table of r_tmp;
  7      emp_recs nt_emp;
  8  begin
  9      select e.empno
 10             , e.deptno
 11             , e.sal
 12      bulk collect into emp_recs
 13      from emp e;
 14      dbms_output.put_line('no of recs selected = '||emp_recs.count );
 15      forall i in emp_recs.first..emp_recs.last
 16          insert into temp_emp
 17          values emp_recs(i);
 18      dbms_output.put_line('no of recs inserted = '||sql%rowcount );
 19* end;
 20  /
no of recs selected = 17
no of recs inserted = 17

PL/SQL procedure successfully completed.

SQL> 

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

Кроме того, если запись действительно соответствует существующей таблице, мы можем объявитьВместо этого вложенная таблица с синтаксисом% ROWTYPE.

  1  declare
  2      type nt_emp temp_emp%rowtype;
  3      emp_recs nt_emp;
  4  begin

Bulk Collect и Forall более эффективны, чем обычная реализация RBAR, но они все еще вялые по сравнению с чистым SQL.Поэтому обычно мы будем использовать такую ​​конструкцию только в том случае, если мы предпринимаем некоторые промежуточные манипуляции с данными в массиве, что само по себе не может быть выполнено в SQL.По мере того, как функциональность Oracle в SQL увеличивается с каждым выпуском, становится все реже находить такую ​​необходимость.

4 голосов
/ 22 ноября 2011

Вы можете использовать BULK COLLECT для заполнения массива (или таблицы pl / sql как таковой).
Как таковой:

set serveroutput on
declare
  type xyz is record(colA number ,
                     colB Date) ;
  type xyz_table is table of xyz;

  p_xyz_table xyz_table ;

begin
    select level, sysdate+level 
           bulk collect into p_xyz_table
      from dual
      connect by level < 15 ;
      dbms_output.put_line('records=>' || p_xyz_table.count);
      FOR i IN  1 .. p_xyz_table.COUNT LOOP
          dbms_output.put_line(' colA=> ' || p_xyz_table(i).colA || '; colB=>' || p_xyz_table(i).colB);
      end loop ;
end ;
/

results:
records=>14
 colA=> 1; colB=>23/11/11 09:20:00
 colA=> 2; colB=>24/11/11 09:20:00
 colA=> 3; colB=>25/11/11 09:20:00
 colA=> 4; colB=>26/11/11 09:20:00
 colA=> 5; colB=>27/11/11 09:20:00
 colA=> 6; colB=>28/11/11 09:20:00
 colA=> 7; colB=>29/11/11 09:20:00
 colA=> 8; colB=>30/11/11 09:20:00
 colA=> 9; colB=>01/12/11 09:20:00
 colA=> 10; colB=>02/12/11 09:20:00
 colA=> 11; colB=>03/12/11 09:20:00
 colA=> 12; colB=>04/12/11 09:20:00
 colA=> 13; colB=>05/12/11 09:20:00
 colA=> 14; colB=>06/12/11 09:20:00

проверить документацию @ http://docs.oracle.com/cd/B10501_01/appdev.920/a96624/05_colls.htm, это очень пригодилось мне в прошлом.(это также ответит на ваш вопрос о EXTEND)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...