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

Откуда: Москва
Сообщений: 320

-- пакет с описанием курсора и табличным типом
create or replace PACKAGE KK_ST_STORE_OP as 

cursor C_OP(PSTORELIST in integer ) is
 select PSTORELIST as StoreList  from  dual;

TYPE  C_OP_tab IS TABLE OF  C_OP%ROWTYPE;

function StoreOpTable(PSTORELIST in integer ) return C_OP_tab ;

end KK_ST_STORE_OP;
/

create or replace PACKAGE BODY KK_ST_STORE_OP as 

function StoreOpTable(PSTORELIST in integer ) return C_OP_tab is
 v_OP_tab  C_OP_tab := C_OP_tab();
begin

 OPEN  C_OP(PSTORELIST );
FETCH  C_OP BULK COLLECT INTO v_OP_tab;
CLOSE  C_OP; 

return v_OP_tab ;

end StoreOpTable;  

end KK_ST_STORE_OP;
/

select * from 
 table(
  cast( KK_ST_STORE_OP.StoreOpTable(:PSTORELIST ) as KK_ST_STORE_OP.C_OP_tab  )
       )
/



Получаю [1]: (Error): ORA-00902: неверн.тип данных
в чем проблема, не очень понимаю, и вообще так можно делать ???
24 фев 11, 15:07    [10284034]     Ответить | Цитировать Сообщить модератору
 Re: BULK COLLECT. Что делаю не так  [new]
bdsm_sql
Member

Откуда:
Сообщений: 948
кастовать можно в SQL-ный тип (CREATE TYPE ...)
24 фев 11, 15:08    [10284051]     Ответить | Цитировать Сообщить модератору
 Re: BULK COLLECT. Что делаю не так  [new]
DVE
Member

Откуда: Москва
Сообщений: 320
вот хочу от этого уйти!!! (от create type)

для этого все и закрутил =)
24 фев 11, 15:09    [10284059]     Ответить | Цитировать Сообщить модератору
 Re: BULK COLLECT. Что делаю не так  [new]
DVE
Member

Откуда: Москва
Сообщений: 320
Задача : при изменении набора полей в запросе не перестраивать тип
24 фев 11, 15:10    [10284071]     Ответить | Цитировать Сообщить модератору
 Re: BULK COLLECT. Что делаю не так  [new]
_Nikotin
Member

Откуда: СПб
Сообщений: 2965
DVE,

Сделать функцию pipelined, тогда тип будет неявно создаваться.
24 фев 11, 15:51    [10284468]     Ответить | Цитировать Сообщить модератору
 Re: BULK COLLECT. Что делаю не так  [new]
_Nikotin
Member

Откуда: СПб
Сообщений: 2965
SQL> drop table t1;
 
Table dropped
SQL> create table t1 as select 1 a from dual;
 
Table created
SQL> create or replace package pkg1 is
  2    cursor cur is select * from t1;
  3    type cur_tab is table of cur%rowtype;
  4    function f return cur_tab pipelined;
  5  end;
  6  /
 
Package created
SQL> create or replace package body pkg1 is
  2    function f return cur_tab pipelined is
  3      r cur%rowtype;
  4    begin
  5      open cur;
  6      fetch cur into r;
  7      pipe row (r);
  8      close cur;
  9    end;
 10  end;
 11  /
 
Package body created
SQL> alter table t1 add b number default 2;
 
Table altered
SQL> select * from table(pkg1.f);
 
         A          B
---------- ----------
         1          2
24 фев 11, 15:56    [10284531]     Ответить | Цитировать Сообщить модератору
 Re: BULK COLLECT. Что делаю не так  [new]
bdsm_sql
Member

Откуда:
Сообщений: 948
_Nikotin
с пайплайном проблема та же, если использовать бинды в кач. параметров для ф-ции - необходимо кастовать в табличный тип
24 фев 11, 15:59    [10284560]     Ответить | Цитировать Сообщить модератору
 Re: BULK COLLECT. Что делаю не так  [new]
AlexFF__|
Member

Откуда:
Сообщений: 2855
bdsm_sql
_Nikotin
с пайплайном проблема та же, если использовать бинды в кач. параметров для ф-ции - необходимо кастовать в табличный тип

или кастовать бинды )
24 фев 11, 16:06    [10284632]     Ответить | Цитировать Сообщить модератору
 Re: BULK COLLECT. Что делаю не так  [new]
_Nikotin
Member

Откуда: СПб
Сообщений: 2965
bdsm_sql,

не понял что и где кастовать:
+ test
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> drop table t1;

Table dropped.

SQL>
SQL>
SQL> create table t1 as select 1 a from dual;

Table created.

SQL>
SQL> create or replace package pkg1 is
  2    cursor cur(c number) is select t1.*, c from t1;
  3    type cur_tab is table of cur%rowtype;
  4    function f(c number) return cur_tab pipelined;
  5  end;
  6  /

Package created.

SQL>
SQL> create or replace package body pkg1 is
  2    function f(c number) return cur_tab pipelined is
  3      r cur%rowtype;
  4    begin
  5      open cur(c);
  6      fetch cur into r;
  7      pipe row (r);
  8      close cur;
  9    end;
 10  end;
 11  /

Package body created.

SQL>
SQL> alter table t1 add b number default 2;

Table altered.

SQL>
SQL> var c number
SQL> exec :c:=3

PL/SQL procedure successfully completed.

SQL> select * from table(pkg1.f(:c));

         A          B          C
---------- ---------- ----------
         1          2          3
24 фев 11, 16:09    [10284660]     Ответить | Цитировать Сообщить модератору
 Re: BULK COLLECT. Что делаю не так  [new]
DVE
Member

Откуда: Москва
Сообщений: 320
Спасибо!!! работает!
24 фев 11, 16:12    [10284682]     Ответить | Цитировать Сообщить модератору
 Re: BULK COLLECT. Что делаю не так  [new]
AlexFF__|
Member

Откуда:
Сообщений: 2855
_Nikotin
bdsm_sql,

не понял что и где кастовать

Это прикол 9
24 фев 11, 16:13    [10284693]     Ответить | Цитировать Сообщить модератору
 Re: BULK COLLECT. Что делаю не так  [new]
bdsm_sql
Member

Откуда:
Сообщений: 948
AlexFF__|
_Nikotin
bdsm_sql,

не понял что и где кастовать

Это прикол 9

было и на 10-ке. подробностей не припомню
24 фев 11, 16:35    [10284884]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить