как добавить значения в тип оракула - PullRequest
2 голосов
/ 08 июля 2010

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

Например (псевдо):

insert into mytype select 1 from dual;
insert into mytype select 3 from dual;
insert into mytype select 5 from dual;

open cursor_1 for select * from table(mytype);

Это возможно сделать в pl / sql?

Я знаю, что это тривиально и может быть объединено в один запрос, ноМоя реальная потребность - иметь разные запросы и продолжать добавлять результаты в mytype.

Ответы [ 2 ]

5 голосов
/ 08 июля 2010

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

Вы можете выбрать скалярную переменную, а затем процедурно добавить ее к коллекции.

SQL> create type mytype as table of integer;
  2  /

Type created.

SQL> set serveroutput on
SQL> l
  1  declare
  2    mytable  mytype := mytype();
  3    cursor_1 sys_refcursor;
  4    x  integer;
  5    procedure append_to_table( t IN OUT mytype, y IN INTEGER)
  6      is
  7      begin
  8        t.extend();
  9        t(t.COUNT) := y;
 10      end append_to_table;
 11  begin
 12    select 1 into x from dual;
 13    append_to_table( mytable, x );
 14    select 3 into x from dual;
 15    append_to_table( mytable, x );
 16    select 5 into x from dual;
 17    append_to_table( mytable, x );
 18    open cursor_1 for select * from table(cast(mytable as mytype));
 19    fetch cursor_1 into x;
 20    dbms_output.put_line(x);
 21    fetch cursor_1 into x;
 22    dbms_output.put_line(x);
 23    fetch cursor_1 into x;
 24    dbms_output.put_line(x);
 25    close cursor_1;
 26* end;
SQL> /
1
3
5

PL/SQL procedure successfully completed.
4 голосов
/ 13 июля 2010

Управление коллекциями PL / SQL стало намного проще, начиная с 10g, что дало нам несколько операторов SET, которые мы можем использовать с ними.

Как вы знаете, использование функции TABLE () означает, что мы должны использовать тип SQL ...

SQL> create or replace type nums_nt as table of number
  2  /

Type created.

SQL>

Следующий блок заполняет коллекцию некоторыми числами, которые он используетв цикле FOR.Затем он выполняет другой запрос для заполнения второй коллекции.Вторая коллекция добавляется в первую коллекцию с использованием синтаксиса MULTISET UNION.В отличие от оператора SQL UNION, эта реализация не дает дубликатов (для этого мы можем использовать MULTISET UNION DISTINCT).Код завершается повторением первой коллекции снова, чтобы доказать, что она содержит оба набора чисел.

SQL> set serveroutput on
SQL>
SQL> declare
  2      master_nos nums_nt;
  3      fresh_nos nums_nt;
  4  begin
  5
  6      dbms_output.put_line ('get some numbers, print some names');
  7
  8      select id
  9      bulk collect into master_nos
 10      from t23
 11      where name not in ( select upper(name) from t_doctors )
 12      and name not in ( select upper(name) from t_kids );
 13
 14      for r in ( select t23.name
 15                 from t23
 16                      join ( select * from table(master_nos)) sq
 17                             on t23.id = sq.column_value
 18               )
 19      loop
 20          dbms_output.put_line (r.name);
 21      end loop;
 22
 23      dbms_output.put_line ('get more numbers, print all names');
 24
 25      select id
 26      bulk collect into fresh_nos
 27      from t23
 28      where name in ( select upper(name) from t_doctors );
 29
 30      master_nos := master_nos
 31                      MULTISET UNION
 32                   fresh_nos;
 33
 34      for r in ( select t23.name
 35                 from t23
 36                      join ( select * from table(master_nos)) sq
 37                             on t23.id = sq.column_value
 38               )
 39      loop
 40          dbms_output.put_line (r.name);
 41      end loop;
 42
 43  end;
 44  /
get some numbers, print some names
CAT
PINNER BLINN
LORAX
MR KNOX
FOX IN SOCKS
get more numbers, print all names
CAT
PINNER BLINN
LORAX
MR KNOX
FOX IN SOCKS
DR SINATRA
DR FONZ

PL/SQL procedure successfully completed.

SQL>
...