Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / type, table и function pipelined / 16 сообщений из 16, страница 1 из 1
04.07.2016, 12:55:30
    #39267264
LeoArslan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type, table и function pipelined
Добрый день. Есть тип, на основании него создаю таблицу. Затем хочу реализовать функцию которая вернет "таблицу" с помощью pipe row и получаю "expression is of wrong type". Причем если таблицу создавать явно(с описанием столбцов), то такой проблемы нет. Если кто-то подскажет варианты решения, то буду очень благодарен

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
CREATE OR REPLACE TYPE typeTest AS OBJECT 
(fio VARCHAR2(200)
  ,ID NUMBER(20));

CREATE GLOBAL TEMPORARY TABLE tmp_table_test OF typeTest;

create or replace package pTest as
    TYPE pTypeTest IS TABLE OF tmp_table_test%ROWTYPE;
    function fTest return pTypeTest pipelined;
   end;
  
create or replace package body pTest as
function fTest return pTypeTest pipelined
    is
	begin
		FOR curr IN (SELECT * FROM tmp_table_test) 
		LOOP	
			pipe row (curr);
		END LOOP;
      return;
    end;
end;
 

Предупреждение: Тело пакета создано с ошибками компиляции.

>show errors
Ошибки для PACKAGE BODY PTEST:

LINE/COL ERROR
-------- -----------------------------------------------------
7/4      PL/SQL: Statement ignored
7/14     PLS-00382: expression is of wrong type
...
Рейтинг: 0 / 0
04.07.2016, 13:28:25
    #39267292
!Z!
!Z!
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type, table и function pipelined
LeoArslan,

Надо привести результат запроса к необходимому типу.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
create or replace package body pTest as
function fTest return pTypeTest pipelined
    is
  begin
      FOR curr IN (SELECT c.fio,c.id  FROM tmp_table_test c)
      LOOP
        pipe row (typeTest(curr.fio, curr.id));
      END LOOP;
  end;
end;
...
Рейтинг: 0 / 0
04.07.2016, 13:35:45
    #39267302
LeoArslan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type, table и function pipelined
!Z!,
Спасибо. А есть какие-то варианты без перечисления полей в "pipe row (typeTest(curr.fio, curr.id));" ?
...
Рейтинг: 0 / 0
04.07.2016, 13:42:25
    #39267307
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type, table и function pipelined
Код: plsql
1.
CREATE GLOBAL TEMPORARY TABLE tmp_table_test(fio VARCHAR2(200),ID NUMBER(20)); --OF typeTest;
...
Рейтинг: 0 / 0
04.07.2016, 13:48:03
    #39267315
LeoArslan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type, table и function pipelined
andrey_anonymous,
Да этот вариант работает как я указал в самом начале. Не очень хочется описывать поля в таблице,в типе, а потом перечислять еще и в функции.Потом сложно сопровождать когда надо что то изменить
...
Рейтинг: 0 / 0
04.07.2016, 13:51:38
    #39267317
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type, table и function pipelined
LeoArslanandrey_anonymous,
Да этот вариант работает как я указал в самом начале. Не очень хочется описывать поля в таблице,в типе, а потом перечислять еще и в функции.Потом сложно сопровождать когда надо что то изменить
Вот чтобы не перечислять/не переписывать - не надо создавать таблицу as of type.
Нужный для пакетной pipelined SQL-тип будет создан автомагически на основании описания табличного типа в пакете, который - table of %rowtype
...
Рейтинг: 0 / 0
04.07.2016, 13:54:25
    #39267320
orawish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type, table и function pipelined
LeoArslanandrey_anonymous,
Да этот вариант работает как я указал в самом начале. Не очень хочется описывать поля в таблице,в типе, а потом перечислять еще и в функции.Потом сложно сопровождать когда надо что то изменить
куда как лучше поналудить типов, обернуть их в (к примеру) в джаву..

шутка
...
Рейтинг: 0 / 0
04.07.2016, 21:03:52
    #39267660
Ярослав Батозский
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type, table и function pipelined
LeoArslan,

если создаете пайплановую функцию, то тип, который она возвращает, надо объявлять на уровне схемы, а не в пакете
...
Рейтинг: 0 / 0
05.07.2016, 15:45:58
    #39268084
suPPLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type, table и function pipelined
Ярослав БатозскийLeoArslan,

если создаете пайплановую функцию, то тип, который она возвращает, надо объявлять на уровне схемы, а не в пакете
Только не "надо", а "стоит". Некоторых устраивает то, что Oracle автоматически создаёт для конвейеров, возвращающих пакетные типы, соответствующие объектные типы.
...
Рейтинг: 0 / 0
06.07.2016, 18:38:24
    #39269208
stax..
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type, table и function pipelined
LeoArslanДобрый день. Есть тип, на основании него создаю таблицу. Затем хочу реализовать функцию которая вернет "таблицу" с помощью pipe row и получаю "expression is of wrong type". Причем если таблицу создавать явно(с описанием столбцов), то такой проблемы нет. Если кто-то подскажет варианты решения, то буду очень благодарен

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
CREATE OR REPLACE TYPE typeTest AS OBJECT 
(fio VARCHAR2(200)
  ,ID NUMBER(20));

CREATE GLOBAL TEMPORARY TABLE tmp_table_test OF typeTest;

create or replace package pTest as
    TYPE pTypeTest IS TABLE OF tmp_table_test%ROWTYPE;
    function fTest return pTypeTest pipelined;
   end;
  
create or replace package body pTest as
function fTest return pTypeTest pipelined
    is
	begin
		FOR curr IN (SELECT * FROM tmp_table_test) 
		LOOP	
			pipe row (curr);
		END LOOP;
      return;
    end;
end;
 

Предупреждение: Тело пакета создано с ошибками компиляции.

>show errors
Ошибки для PACKAGE BODY PTEST:

LINE/COL ERROR
-------- -----------------------------------------------------
7/4      PL/SQL: Statement ignored
7/14     PLS-00382: expression is of wrong type




CREATE GLOBAL TEMPORARY TABLE tmp_table_test(F typeTest);

і тд


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SQL> insert into stax_tmp_table_test values(stax_typeTest('StaxSh',202));

1 row created.

SQL> select stax_pTest.fTest from dual;

FTEST(FIO, ID)
--------------------------------------------------------------------------------
STAX_TYPETEST_TT(STAX_TYPETEST('StaxSh', 202))

.....
stax
...
Рейтинг: 0 / 0
06.07.2016, 18:48:01
    #39269219
stax..
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type, table и function pipelined
LeoArslan,

в догонку
Код: plsql
1.
2.
3.
4.
5.
SQL> select * from table(stax_pTest.fTest);

FIO                                    ID
------------------------------ ----------
StaxSh                                202



.....
stax
...
Рейтинг: 0 / 0
12.07.2016, 03:30:24
    #39272127
Ярослав Батозский
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type, table и function pipelined
suPPLerЯрослав БатозскийLeoArslan,

если создаете пайплановую функцию, то тип, который она возвращает, надо объявлять на уровне схемы, а не в пакете
Только не "надо", а "стоит". Некоторых устраивает то, что Oracle автоматически создаёт для конвейеров, возвращающих пакетные типы, соответствующие объектные типы.

Думаю, лучше создавать на уровне схемы. Если в пакете -- не удастся сделать СЕЛЕКТ из такой коллекции.
Вот, только что получил и убедился, о чём знал раньше
[Error] PLS-00642 (58: 55): PLS-00642: local collection types not allowed in SQL statements

11.2.0.4
...
Рейтинг: 0 / 0
12.07.2016, 07:26:52
    #39272143
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type, table и function pipelined
Ярослав БатозскийsuPPLerЯрослав Батозскийесли создаете пайплановую функцию , то тип, который она возвращает, надо объявлять на уровне схемы, а не в пакетеТолько не "надо", а "стоит". Некоторых устраивает то, что Oracle автоматически создаёт для конвейеров, возвращающих пакетные типы, соответствующие объектные типы.Думаю, лучше создавать на уровне схемы. Если в пакете -- не удастся сделать СЕЛЕКТ из такой коллекции.Чудак, ты непроходимо непоследователен. Табличные функции не могут быть не-select-ируемыми. Просто по определению.Ярослав БатозскийВот, только что получил и убедился, о чём знал раньшеТвои знания настолько обрывочны, что их не стоит выплёскивать в форум во избежание.
...
Рейтинг: 0 / 0
12.07.2016, 13:25:47
    #39272388
suPPLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type, table и function pipelined
Ярослав БатозскийДумаю, лучше создавать на уровне схемы. Если в пакете -- не удастся сделать СЕЛЕКТ из такой коллекции.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
create package dropme_pkg
as
  type pkg_rec is record
    ( n number, d date );
    
  type pkg_rec_tab is table of pkg_rec;
    
  function generate 
    ( n integer )
    return pkg_rec_tab
    pipelined;
end dropme_pkg;
/

create package body dropme_pkg
as
  function generate 
    ( n integer )
    return pkg_rec_tab
    pipelined
  is
    l_rec pkg_rec;
    l_date date := trunc(sysdate);
  begin
    for i in 1..n
    loop
      l_rec.n := i;
      l_rec.d := l_date + i;
      pipe row( l_rec );
    end loop;
  end generate;
end dropme_pkg;
/

select * from table( dropme_pkg.generate(3) );

select * 
  from user_objects 
 where object_type = 'TYPE' 
   and object_name like 
     'SYS\_PLSQL\_' || 
     (select object_id from user_objects where object_type = 'PACKAGE' and object_name = 'DROPME_PKG' ) || 
     '%' escape '\' ;
...
Рейтинг: 0 / 0
12.07.2016, 14:40:21
    #39272449
Ярослав Батозский
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type, table и function pipelined
[quote Elic]Ярослав БатозскийТвои знания настолько обрывочны, что их не стоит выплёскивать в форум во избежание.

Я говорил вот про что:
http://www.sql.ru/forum/240311/pl-sql-podskazhite
http://www.dba-oracle.com/t_pls_00642_local_collection_types_not_allowed_in_sql_statement.htm
...
Рейтинг: 0 / 0
12.07.2016, 14:54:26
    #39272465
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type, table и function pipelined
Ярослав БатозскийЯ говорил вот про что:Ты можешь подразумевать всё что угодно. Но здесь вполне конкретная тема, в которой ты себя проявил с наихудшей стороны..
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / type, table и function pipelined / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]