Как в создать набор временных значений в Oracle DB?

Хочу сделать набор значений, например:

1, "Иванов", "Иван", "Иваныч"
2, "Петров", "Петр", "Петрович"
3, "Сидоров", "Сидор", "Сидорович"

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

В sql server я бы для этого создал временную таблицу и сделал select into в нее. В oracle не знаю что для этого используют. Нагуглил про объект типа table, попробовал нечто такое:

set serveroutput on
declare
    type rec is record 
        (
            id number(16,0),
            code varchar2(25 char),
            status varchar2(100 char),
            descr varchar2(256 char),
            flag number(1,0)
        );
    type statuses is table of rec;
    sts statuses;
begin
    insert into sts (id, code, status, descr, flag)
    values (1, 'ERROR', 'Ошибка запроса', 'Ошибка запроса', 1);
    
    --select id, code, status, descr, flag bulk collect 
    --into sts from dbo_statuses;
end;

Вот то что закомменчено, то работает. А то что не закоменчено дает ошибку "таблица или представление пользователя не существует".

Как вообще мою задачу в оракл-стиле решить?


Ответы (1 шт):

Автор решения: 0xdb

Всё правилно, только:

  • чтобы использовать в запросе надо объявить либо на уровне схемы, либо в пакете
  • вместо insert ... into значения можно присвоить либо запросом
    select ... bulk collect into ..., либо конструкторами

Простейший пример:

create or replace type rec force is object (
    id number, code varchar2(16 char), status varchar2(32 char));
/
create or replace type statuses is table of rec;
/
var rc refcursor
declare
    sts statuses := statuses ();
begin
    sts :=  statuses (
        rec (1, 'ERROR', 'Ошибка запроса'),
        rec (2, 'FATAL', 'Ошибка непонятная'));
    open :rc for select * from table (sts);
end;
/

Результат:

        ID CODE             STATUS                          
---------- ---------------- --------------------------------
         1 ERROR            Ошибка запроса                  
         2 FATAL            Ошибка непонятная               
→ Ссылка