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

Откуда:
Сообщений: 1348
На 9

Connected to Oracle9i Enterprise Edition Release 9.2.0.8.0 
Connected as frsdb_dev
 
SELECT * FROM TABLE(calc_npz_advance.ez_trader(DATE '2007-04-01'));
 
EZ_TRADER_ID  TRADER_ID     NPZ_ID
------------ ---------- ----------
      240124     210019          4
      240124     150341          4
      240124     232134          4
var t DATE
exec :t := DATE '2007-04-01'
 
PL/SQL procedure successfully completed
t
---------
01.04.2007
SELECT *
  FROM TABLE(calc_npz_advance.ez_trader(:t));
 
SELECT *
  FROM TABLE(calc_npz_advance.ez_trader(:t))
 
ORA-22905: cannot access rows from a non-nested table item
t
---------
01.04.2007
 
SQL> 

А здесь работает

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 
Connected as frsdb_cfr
 
SELECT * FROM TABLE(calc_npz_advance.ez_trader(DATE '2007-04-01'));
 
EZ_TRADER_ID  TRADER_ID     NPZ_ID
------------ ---------- ----------
      240124     210019          4
      240124     150341          4
      240124     232134          4
var t DATE
exec :t := DATE '2007-04-01'
 
PL/SQL procedure successfully completed
t
---------
01.04.2007
SELECT *
  FROM TABLE(calc_npz_advance.ez_trader(:t));
 
EZ_TRADER_ID  TRADER_ID     NPZ_ID
------------ ---------- ----------
      240124     210019          4
      240124     150341          4
      240124     232134          4
t
---------
01.04.2007
 
SQL> 

Вопрос собственно. Как написать код одинаково работающий под этими двумя версиями.
25 сен 07, 17:47    [4713599]     Ответить | Цитировать Сообщить модератору
 Re: pipelined функция с переменной на 9 валится в отличие от 10  [new]
_Alex_SMIRNOV_
Member

Откуда: Киев
Сообщений: 1519
А можно показать функцию calc_npz_advance.ez_trader?
25 сен 07, 17:56    [4713657]     Ответить | Цитировать Сообщить модератору
 Re: pipelined функция с переменной на 9 валится в отличие от 10  [new]
Andrew Max
Member

Откуда:
Сообщений: 1045
Попробуйте:
select * from table (calc_npz_advance.ez_trader(cast(:t as date)));
25 сен 07, 17:57    [4713665]     Ответить | Цитировать Сообщить модератору
 Re: pipelined функция с переменной на 9 валится в отличие от 10  [new]
_Alex_SMIRNOV_
Member

Откуда: Киев
Сообщений: 1519
select * from table (cast(calc_npz_advance.ez_trader(:t )as .....));
25 сен 07, 17:59    [4713686]     Ответить | Цитировать Сообщить модератору
 Re: pipelined функция с переменной на 9 валится в отличие от 10  [new]
Proteus
Member

Откуда:
Сообщений: 1348
Andrew Max
Попробуйте:
select * from table (calc_npz_advance.ez_trader(cast(:t as date)));

так проходит.
25 сен 07, 18:07    [4713742]     Ответить | Цитировать Сообщить модератору
 Re: pipelined функция с переменной на 9 валится в отличие от 10  [new]
Proteus
Member

Откуда:
Сообщений: 1348
_Alex_SMIRNOV_
select * from table (cast(calc_npz_advance.ez_trader(:t )as .....));

неудача
Connected to Oracle9i Enterprise Edition Release 9.2.0.8.0 
Connected as frsdb_dev
 
SELECT * FROM TABLE(calc_npz_advance.ez_trader(DATE '2007-04-01'));
 
EZ_TRADER_ID  TRADER_ID     NPZ_ID
------------ ---------- ----------
      240124     210019          4
      240124     150341          4
      240124     232134          4
var t DATE
exec :t := DATE '2007-04-01'
 
PL/SQL procedure successfully completed
t
---------
01.04.2007
SELECT *
  FROM TABLE(cast (calc_npz_advance.ez_trader(:t)as calc_npz_advance.tez_trader));
 
SELECT *
  FROM TABLE(cast (calc_npz_advance.ez_trader(:t)as calc_npz_advance.tez_trader))
 
ORA-00902: invalid datatype
t
---------
01.04.2007
 

calc_npz_advance.tez_trader is table of ...
25 сен 07, 18:09    [4713756]     Ответить | Цитировать Сообщить модератору
 Re: pipelined функция с переменной на 9 валится в отличие от 10  [new]
Proteus
Member

Откуда:
Сообщений: 1348
_Alex_SMIRNOV_
А можно показать функцию calc_npz_advance.ez_trader?

В этом нет необходимости, т.к. сама то функция работает если передавать константу.
25 сен 07, 18:10    [4713762]     Ответить | Цитировать Сообщить модератору
 Re: pipelined функция с переменной на 9 валится в отличие от 10  [new]
xymbo
Member

Откуда: Донской --> Москва
Сообщений: 2560
Может это:
Bug No. 4693041
P.S. Правда там на AIX, но очень похоже на Ваш случай.
25 сен 07, 18:12    [4713776]     Ответить | Цитировать Сообщить модератору
 Re: pipelined функция с переменной на 9 валится в отличие от 10  [new]
Proteus
Member

Откуда:
Сообщений: 1348
причем при явном преобразовании переменной к дате все та же ошибка.

Connected to Oracle9i Enterprise Edition Release 9.2.0.8.0 
 
SELECT * FROM TABLE(calc_npz_advance.ez_trader(DATE '2007-04-01'));
 
EZ_TRADER_ID  TRADER_ID     NPZ_ID
------------ ---------- ----------
      240124     210019          4
      240124     150341          4
      240124     232134          4
var t DATE
exec :t := DATE '2007-04-01'
 
PL/SQL procedure successfully completed
t
---------
01.04.2007
SELECT *
  FROM TABLE(calc_npz_advance.ez_trader(to_date(:t)));
 
SELECT *
  FROM TABLE(calc_npz_advance.ez_trader(to_date(:t)))
 
ORA-22905: cannot access rows from a non-nested table item
t
---------
01.04.2007
 
25 сен 07, 18:18    [4713823]     Ответить | Цитировать Сообщить модератору
 Re: pipelined функция с переменной на 9 валится в отличие от 10  [new]
Andrew Max
Member

Откуда:
Сообщений: 1045
Proteus
_Alex_SMIRNOV_
select * from table (cast(calc_npz_advance.ez_trader(:t )as .....));

неудача
Connected to Oracle9i Enterprise Edition Release 9.2.0.8.0 
Connected as frsdb_dev
 
SELECT * FROM TABLE(calc_npz_advance.ez_trader(DATE '2007-04-01'));
 
EZ_TRADER_ID  TRADER_ID     NPZ_ID
------------ ---------- ----------
      240124     210019          4
      240124     150341          4
      240124     232134          4
var t DATE
exec :t := DATE '2007-04-01'
 
PL/SQL procedure successfully completed
t
---------
01.04.2007
SELECT *
  FROM TABLE(cast (calc_npz_advance.ez_trader(:t)as calc_npz_advance.tez_trader));
 
SELECT *
  FROM TABLE(cast (calc_npz_advance.ez_trader(:t)as calc_npz_advance.tez_trader))
 
ORA-00902: invalid datatype
t
---------
01.04.2007
 

calc_npz_advance.tez_trader is table of ...

Разумеется, неудача, поскольку тип TEZ_TRADER объявлен в пакете, а должен быть SQL-типом - тогда вариант Алекса Смирнова будет работать.
Более того, в описании этого бага (который закрыт как "not a bug") говорится о том, что в 9.2 необходим подобный CAST, и без него, как утверждается по ссылке, работать и не должно.

Возможно, это так и есть, но в документации к 9.2 я не нашел прямых указаний о необходимости CAST (возможно, невнимательно искал).
25 сен 07, 18:29    [4713898]     Ответить | Цитировать Сообщить модератору
 Re: pipelined функция с переменной на 9 валится в отличие от 10  [new]
Timm
Member

Откуда: Moscow, Ё-burg
Сообщений: 3696
Proteus
Вопрос собственно. Как написать код одинаково работающий под этими двумя версиями.

Использовать SQL типы.
25 сен 07, 18:30    [4713904]     Ответить | Цитировать Сообщить модератору
 Re: pipelined функция с переменной на 9 валится в отличие от 10  [new]
Andrew Max
Member

Откуда:
Сообщений: 1045
Andrew Max
...
Возможно, это так и есть, но в документации к 9.2 я не нашел прямых указаний о необходимости CAST (возможно, невнимательно искал).

Хотя - вот, нашел:
PL/SQL User’s Guide and Reference Release 2
Note: A table function returns a collection. In some cases, such as when the top-level query uses SELECT * and the query refers to a PL/SQL variable or a bind variable, you may need a CAST operator around the table function to specify the exact return type.
25 сен 07, 18:31    [4713914]     Ответить | Цитировать Сообщить модератору
 Re: pipelined функция с переменной на 9 валится в отличие от 10  [new]
Dimka08
Member

Откуда:
Сообщений: 319
вместо select *
пишите select f1,f2... все нужные поля
и в функции так же
25 сен 07, 18:40    [4713957]     Ответить | Цитировать Сообщить модератору
 Re: pipelined функция с переменной на 9 валится в отличие от 10  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18351
Andrew Max
Разумеется, неудача, поскольку тип TEZ_TRADER объявлен в пакете, а должен быть SQL-типом - тогда вариант Алекса Смирнова будет работать.

Следует отметить, что если ограничиться объявлением типа в пакете, то oracle создаст соответствующий sql-тип автоматически с "автогенерированным" именем.
Потому что без SQL-типа оно в принципе не работоспособно.
Вот на этот-то SQL тип и надо ссылаться в cast.
Ну или объявлять явно, что, вообще говоря, предпочтительнее.
25 сен 07, 18:54    [4714021]     Ответить | Цитировать Сообщить модератору
 Re: pipelined функция с переменной на 9 валится в отличие от 10  [new]
andrey_anonymous
Member

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

Следует отметить, что если ограничиться объявлением типа в пакете, то oracle создаст соответствующий sql-тип автоматически с "автогенерированным" именем.

SQL> select * from user_types;

TYPE_NAME                      TYPE_OID                         TYPECODE                       ATTRIBUTES    METHODS PREDEFINED INCOMPLETE FINAL INSTANTIABLE SUPERTYPE_OWNER                SUPERTYPE_NAME                 LOCAL_ATTRIBUTES LOCAL_METHODS TYPEID
------------------------------ -------------------------------- ------------------------------ ---------- ---------- ---------- ---------- ----- ------------ ------------------------------ ------------------------------ ---------------- ------------- --------------------------------

SQL> create package ane_testp as
  2  type t_tab_of_int is table of integer;
  3  function f return t_tab_of_int pipelined;
  4  end;
  5  /

Package created

SQL> select * from user_types;

TYPE_NAME                      TYPE_OID                         TYPECODE                       ATTRIBUTES    METHODS PREDEFINED INCOMPLETE FINAL INSTANTIABLE SUPERTYPE_OWNER                SUPERTYPE_NAME                 LOCAL_ATTRIBUTES LOCAL_METHODS TYPEID
------------------------------ -------------------------------- ------------------------------ ---------- ---------- ---------- ---------- ----- ------------ ------------------------------ ------------------------------ ---------------- ------------- --------------------------------

SYS_PLSQL_155120_9_1           3AF7EE62DF57167AE044000077B004C0 COLLECTION                              0          0 NO         NO         YES   YES                                                                                                       
SYS_PLSQL_155120_DUMMY_1       3AF7EE62DF5B167AE044000077B004C0 COLLECTION                              0          0 NO         NO         YES   YES                                                                                                       

2 rows selected

SQL> 
25 сен 07, 18:58    [4714042]     Ответить | Цитировать Сообщить модератору
 Re: pipelined функция с переменной на 9 валится в отличие от 10  [new]
xymbo
Member

Откуда: Донской --> Москва
Сообщений: 2560
Это в только в 10?
25 сен 07, 19:07    [4714088]     Ответить | Цитировать Сообщить модератору
 Re: pipelined функция с переменной на 9 валится в отличие от 10  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18351
xymbo
Это в только в 10?

Данный тест проведен на 9.2.0.7.
На 8.1.7.4 оракель этого не умел в принципе, поэтому объявлять возвращаемый pipelined/табличной функцией тип в пакете было никак нельзя - только create type.
25 сен 07, 19:09    [4714105]     Ответить | Цитировать Сообщить модератору
 Re: pipelined функция с переменной на 9 валится в отличие от 10  [new]
xymbo
Member

Откуда: Донской --> Москва
Сообщений: 2560
Да, не знал. Но наверно уж лучше использовать CREATE TYPE..., чтобы обезопасить себя от всяких таких ошибок.Как Вы считаете?
25 сен 07, 19:13    [4714122]     Ответить | Цитировать Сообщить модератору
 Re: pipelined функция с переменной на 9 валится в отличие от 10  [new]
Timm
Member

Откуда: Moscow, Ё-burg
Сообщений: 3696
xymbo
Да, не знал. Но наверно уж лучше использовать CREATE TYPE..., чтобы обезопасить себя от всяких таких ошибок.Как Вы считаете?

Есть сопутствующие ORA-00600 (Notes 2136476, 2280512). Как думаешь? :)
и вообще, кому нужны непонятные типы, иногда невалидные. некоторые DBA почему то хотят их удалить...
25 сен 07, 19:22    [4714146]     Ответить | Цитировать Сообщить модератору
 Re: pipelined функция с переменной на 9 валится в отличие от 10  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18351
Timm
некоторые DBA почему то хотят их удалить...

Это неправильные DBA... Одна надежда - что они еще не знают ключевого слова force :)
25 сен 07, 19:27    [4714157]     Ответить | Цитировать Сообщить модератору
 Re: pipelined функция с переменной на 9 валится в отличие от 10  [new]
xymbo
Member

Откуда: Донской --> Москва
Сообщений: 2560
Timm
xymbo
Да, не знал. Но наверно уж лучше использовать CREATE TYPE..., чтобы обезопасить себя от всяких таких ошибок.Как Вы считаете?

Есть сопутствующие ORA-00600 (Notes 2136476, 2280512). Как думаешь? :)
и вообще, кому нужны непонятные типы, иногда невалидные. некоторые DBA почему то хотят их удалить...

Timm and andrey_anonymous
А вы часто используете такие типы?
25 сен 07, 19:32    [4714166]     Ответить | Цитировать Сообщить модератору
 Re: pipelined функция с переменной на 9 валится в отличие от 10  [new]
sdfsergy
Member

Откуда:
Сообщений: 3
Было замечено поедание сервером 9.2 памяти при использовании pipelined function, при использовании таких функций вложенных друг в друга. Постарайтесь использовать View, или в 9ке обратите внимание на статистики PGA memory при использовании функций pipeline. При использовании табличных функций (не pipeline), на 9.2 такой еффект был побежден. На 10.2 при этом, любые табличные функции работают нормально.
10 окт 07, 16:14    [4780366]     Ответить | Цитировать Сообщить модератору
 Re: pipelined функция с переменной на 9 валится в отличие от 10  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18351
sdfsergy
Было замечено поедание сервером 9.2 памяти

Если склероз мне не изменяет, то "поедание" наблюдается в случае, если не выгребать курсор до конца. Если выгребать полностью, то вроде все было чисто.
12 окт 07, 20:41    [4789661]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить