Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Создать курсор из коллекции  [new]
Descriptor
Member

Откуда:
Сообщений: 58
День добрый
Есть коллекция - а как создать курсор, на основе коллекции, чтобы выдавать его наружу из процедуры. Есть, но немного не то по адресу:
https://www.sql.ru/forum/actualthread.aspx?tid=402275&hl=%ea%f3%f0%f1%ee%f0+%ea%ee%eb%eb%e5%ea%f6%e8%e8
Как-нибудь вот так можно?
Select * from table ( <имя коллекции>)
11 мар 08, 10:52    [5392457]     Ответить | Цитировать Сообщить модератору
 Re: Создать курсор из коллекции  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
pipelined функции
11 мар 08, 10:55    [5392482]     Ответить | Цитировать Сообщить модератору
 Re: Создать курсор из коллекции  [new]
Sashko81
Member

Откуда: Киев
Сообщений: 103
open cur for
select * from table(cast(<имя коллекции> as <Тип коллекции>));
11 мар 08, 11:09    [5392598]     Ответить | Цитировать Сообщить модератору
 Re: Создать курсор из коллекции  [new]
Descriptor
Member

Откуда:
Сообщений: 58
Sashko81
open cur for
select * from table(cast(<имя коллекции> as <Тип коллекции>));


Попробовал
declare
   cur            sys_refcursor;


   cursor c_in
   is
      (select 1
         from dual);

   cursor c_out
   is
      (select 1
         from dual);

   type tcollect_test is table of c_in%rowtype
      index by binary_integer;

   collect_test   tcollect_test;
   test_int       integer;
begin
   open c_in;

   fetch c_in
   bulk collect into collect_test;

   close c_in;

   open c_out for
      select *
        from table (cast (collect_test as rectabtype1));
end;


Ошибка:
11 мар 08, 11:22    [5392684]     Ответить | Цитировать Сообщить модератору
 Re: Создать курсор из коллекции  [new]
Descriptor
Member

Откуда:
Сообщений: 58
Точнее так
....
   open c_out for
      select *
        from table (cast (collect_test as tcollect_test));

11 мар 08, 11:23    [5392695]     Ответить | Цитировать Сообщить модератору
 Re: Создать курсор из коллекции  [new]
Descriptor
Member

Откуда:
Сообщений: 58
Файл снимка ошибки

К сообщению приложен файл. Размер - 0Kb
11 мар 08, 11:24    [5392709]     Ответить | Цитировать Сообщить модератору
 Re: Создать курсор из коллекции  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Descriptor
Sashko81
open cur for
select * from table(cast(<имя коллекции> as <Тип коллекции>));


Попробовал
Ошибка:
Тип должен быть глобальным
11 мар 08, 11:33    [5392800]     Ответить | Цитировать Сообщить модератору
 Re: Создать курсор из коллекции  [new]
new_mann
Member

Откуда:
Сообщений: 140
Jannny
Descriptor
Sashko81
open cur for
select * from table(cast(<имя коллекции> as <Тип коллекции>));


Попробовал
Ошибка:
Тип должен быть глобальным



10-ка. в этой же pocedure pl/sql таблица, из которой пытаюсь читать, определена
через этот же естественно тип

CREATE OR REPLACE PACKAGE PA1
AS

TYPE t_record IS RECORD (
...
fx RAW(100),
...
);

type ttable IS TABLE OF trecord INDEX BY BINARY_INTEGER;

...


CREATE OR REPLACE PACKAGE BODY PA1
IS

PROCEDURE p1(...)
IS

t1 ttable;
t2 ttable;
c1 SYS_REFCURSOR;

OPEN c1 FOR
'SELECT * FROM table (cast (t1 as ttable))';
...


invalid datatype
13 мар 08, 02:19    [5403293]     Ответить | Цитировать Сообщить модератору
 Re: Создать курсор из коллекции  [new]
new_mann
Member

Откуда:
Сообщений: 140
вместо trecord t_record
ошибка все равно
13 мар 08, 02:27    [5403298]     Ответить | Цитировать Сообщить модератору
 Re: Создать курсор из коллекции  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
new_mann
Jannny
Тип должен быть глобальным
invalid datatype
глобальный тип - это тип, созданный на уровне базы (create type). SQL-тип.

ЗЫ: У нас смена автора или ника? :)
13 мар 08, 09:59    [5403679]     Ответить | Цитировать Сообщить модератору
 Re: Создать курсор из коллекции  [new]
new_mann
Member

Откуда:
Сообщений: 140
2Jannny

новенький... из темы "SELECT курсора FROM таблицы "IS TABLE OF" ?"

кто то писал что не в Create type дело...

Create type в Package?
13 мар 08, 11:35    [5404366]     Ответить | Цитировать Сообщить модератору
 Re: Создать курсор из коллекции  [new]
new_mann
Member

Откуда:
Сообщений: 140
переделал процедуру, которая вызывает другие, чтобы не писала в цикле во временную таблицу, а в коллекцию и скорость работы та же. они работают обычно одинаково по скорости?
26 мар 08, 16:30    [5462912]     Ответить | Цитировать Сообщить модератору
 Re: Создать курсор из коллекции  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
new_mann
они работают обычно одинаково по скорости?
Смотря кто и как пишет. Да и меряет.
26 мар 08, 17:28    [5463412]     Ответить | Цитировать Сообщить модератору
 Re: Создать курсор из коллекции  [new]
new_mann
Member

Откуда:
Сообщений: 140
2Jannny
обычно:
OPEN c FOR
'SELECT * FROM (cast(:1 as t_table))' USING t_data;

есть другие варианты?

кроме невыигрыша в скорости еще ощущается "неудобство" в использовании глобальных типов
и невозможности использования например %TYPE. от понимания почему не легче. хотя работает.

http://citforum.gatchina.net/database/oracle/cast/
2 апр 08, 13:06    [5491782]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить