Как в создать набор временных значений в 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 Ошибка непонятная