powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / type, table и function pipelined
16 сообщений из 16, страница 1 из 1
type, table и function pipelined
    #39267264
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
...
Рейтинг: 0 / 0
type, table и function pipelined
    #39267292
!Z!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
!Z!
Гость
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
type, table и function pipelined
    #39267302
LeoArslan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
!Z!,
Спасибо. А есть какие-то варианты без перечисления полей в "pipe row (typeTest(curr.fio, curr.id));" ?
...
Рейтинг: 0 / 0
type, table и function pipelined
    #39267307
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
CREATE GLOBAL TEMPORARY TABLE tmp_table_test(fio VARCHAR2(200),ID NUMBER(20)); --OF typeTest;
...
Рейтинг: 0 / 0
type, table и function pipelined
    #39267315
LeoArslan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous,
Да этот вариант работает как я указал в самом начале. Не очень хочется описывать поля в таблице,в типе, а потом перечислять еще и в функции.Потом сложно сопровождать когда надо что то изменить
...
Рейтинг: 0 / 0
type, table и function pipelined
    #39267317
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeoArslanandrey_anonymous,
Да этот вариант работает как я указал в самом начале. Не очень хочется описывать поля в таблице,в типе, а потом перечислять еще и в функции.Потом сложно сопровождать когда надо что то изменить
Вот чтобы не перечислять/не переписывать - не надо создавать таблицу as of type.
Нужный для пакетной pipelined SQL-тип будет создан автомагически на основании описания табличного типа в пакете, который - table of %rowtype
...
Рейтинг: 0 / 0
type, table и function pipelined
    #39267320
Фотография orawish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeoArslanandrey_anonymous,
Да этот вариант работает как я указал в самом начале. Не очень хочется описывать поля в таблице,в типе, а потом перечислять еще и в функции.Потом сложно сопровождать когда надо что то изменить
куда как лучше поналудить типов, обернуть их в (к примеру) в джаву..

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

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

если создаете пайплановую функцию, то тип, который она возвращает, надо объявлять на уровне схемы, а не в пакете
Только не "надо", а "стоит". Некоторых устраивает то, что Oracle автоматически создаёт для конвейеров, возвращающих пакетные типы, соответствующие объектные типы.
...
Рейтинг: 0 / 0
type, table и function pipelined
    #39269208
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
type, table и function pipelined
    #39269219
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeoArslan,

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

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



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

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

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

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

Код: 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
type, table и function pipelined
    #39272449
Ярослав Батозский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[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
type, table и function pipelined
    #39272465
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ярослав БатозскийЯ говорил вот про что:Ты можешь подразумевать всё что угодно. Но здесь вполне конкретная тема, в которой ты себя проявил с наихудшей стороны..
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / type, table и function pipelined
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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