почему так не работает?

Barmalei
Дата: 10.03.2007 09:51:12
Решил сделать pipelined функцию...
 select * from v$version;

BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.7.0 - Production
PL/SQL Release 9.2.0.7.0 - Production
CORE    9.2.0.7.0       Production
TNS for 32-bit Windows: Version 9.2.0.7.0 - Production
NLSRTL Version 9.2.0.7.0 - Production

Создаю тип и, собственно, функцию...

SQL> create type test_rec is object(
  2  num_val number,
  3  str_val varchar2(100));
  4  /

Type created.

SQL> create type test_tab is table of test_rec;
  2  /

Type created.

SQL> create function test_fnc return test_tab pipelined is
  2  begin
  3    pipe row( test_rec(1,'test value'));
  4    return;
  5  end;
  6  /

Function created.

SQL> select *
  2  from table(test_fnc);

   NUM_VAL    STR_VAL                                                                         
-----------   -------------------------------------------------------------- 
1                   test value                                                                      


т.е. все вроде работает как и хотелось.
теперь добавляю в функцию входной параметр.

SQL> create or replace function test_fnc(num_param in number) return test_tab pipelined is
  2  begin
  3    pipe row( test_rec(1,'test value'));
  4    return;
  5  end;
  6  /

Function created.

SQL> select *
  2  from table(test_fnc(null));

   NUM_VAL    STR_VAL                                                                         
-----------   -------------------------------------------------------------- 
1                   test value   


Вроде бы тоже все работает если передавать null. Теперь попробую передать не null

SQL> select *
  2  from table(test_fnc(1));
from table(test_fnc(1))
     *
ERROR at line 2:
ORA-22905: cannot access rows from a non-nested table item 

В итоге работает только при явном указании типа

SQL> select *
  2  from table(cast(test_fnc(1) as test_tab));

  NUM_VAL    STR_VAL                                                                         
-----------   -------------------------------------------------------------- 
1                   test value   


Почему не работает когда входной параметр не null? Неужели всегда необходимо явно указывать тип результата?
Denis Popov
Дата: 10.03.2007 11:10:18

Barmalei wrote:

> Почему не работает когда входной параметр не null? Неужели всегда
> необходимо явно указывать тип результата?

В 10.2 работает, м.б. издержки версии.

Posted via ActualForum NNTP Server 1.4

Iscender
Дата: 10.03.2007 15:32:14
У меня на 9.2.0.8 тоже работает
alex-ls
Дата: 12.03.2007 11:07:24
есть в версиях 9 баги, которые выплывают, если явно преобразование к типу не указать...
OlleUp
Дата: 05.07.2007 07:39:55
BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.8.0 - Production
PL/SQL Release 9.2.0.8.0 - Production
CORE	9.2.0.8.0	Production

TNS for 32-bit Windows: Version 9.2.0.8.0 - Production
NLSRTL Version 9.2.0.8.0 - Production


create or replace package p_test is
type trec is record 
(
 n varchar2(120),
 d timestamp
);
type ttab is table of trec;

function f1(a1 in number:=1) return ttab PIPELINED;
end p_test;
/
create or replace package body p_test as

function f1(a1 in number := 1)
return ttab PIPELINED is
t1 ttab;
cr sys_refcursor;
begin
open cr for select to_char(rownum)||'-asdasd', current_timestamp from dual connect by level <=5;
loop
  fetch cr bulk collect into t1;
  exit when cr%NOTFOUND;
end loop;
for i in 1..t1.count loop
  PIPE ROW(t1(i));
end loop;
return;
end f1;

end p_test;
/

select * from table(p_test.f1)
N                                                                                D
-------------------------------------------- -------------------------------------------------
1-asdasd                                                                         05.07.07 14:33:44,343000
2-asdasd                                                                         05.07.07 14:33:44,343000
3-asdasd                                                                         05.07.07 14:33:44,343000
4-asdasd                                                                         05.07.07 14:33:44,343000
5-asdasd                                                                         05.07.07 14:33:44,343000


select * from table(elrestoranv.p_test.f1(2))

ORA-22905: невозможно получить доступ к строкам элементов не вложенных таблиц


Что делать ?
Кто-нибудь побеждал такое ?
Elic
Дата: 05.07.2007 08:24:28
OlleUp
ORA-22905 Что делать ?
STFF