powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Pipeline table function
21 сообщений из 21, страница 1 из 1
Pipeline table function
    #39651644
ArchiSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет!
Подскажите, пожалуйста, почему pipeline table function возвращает всю выборку целиком, а не каждую строку в отдельности с интервалом в 1 сек. И еще такой вопрос - если датасет возвращается целиком, значит все выбранные записи хранятся в PGA, значит никакой разницы с обычной табличной функцией нет. Понимаю, что где-то что-то я делаю не так, но где и что - не могу понять.
Это первый вопрос. Сейчас в этом же топе опубликую второй.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
-- object type declaration (schema level)
create or replace type t_emp_ob is object (
       empno_ob number(4),
       ename_ob varchar2(10)
);
--------------
-- nested table declaration (schema level)
create or replace type t_emp_nt is table of t_emp_ob;
--------------
-- ref cursor declaration (package level)
create or replace package refcur_ptf_pkg
is
       type t_emp_rt is record (empno_ob number(4), ename_ob varchar2(10));
       type refcur_ptf is ref cursor return t_emp_rt;
end refcur_ptf_pkg;



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
create or replace function ptf (dataset in refcur_ptf_pkg.refcur_ptf) 
return t_emp_nt pipelined 
is
   type dataset_tt is table of refcur_ptf_pkg.t_emp_rt index by pls_integer;
   l_dataset dataset_tt;
begin
  fetch dataset bulk collect into l_dataset;
  
  for l_row in l_dataset.first .. l_dataset.last loop
    pipe row(t_emp_ob(l_dataset(l_row).empno_ob, l_dataset(l_row).ename_ob));
    dbms_lock.sleep(1);
  end loop;
  
  close dataset;

end;



Код: plsql
1.
2.
select *
from table(ptf(cursor(select empno, ename from regrep.emp)));
...
Рейтинг: 0 / 0
Pipeline table function
    #39651654
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArchiSQLпочему pipeline table function возвращает всю выборку целиком, а не каждую строку в отдельности с интервалом в 1 сек.Потому что есть такое понятие как fetch_size (array_size).
Запускай свой запрос в SQL*Plus-е после
Код: plsql
1.
set arraysize 1
...
Рейтинг: 0 / 0
Pipeline table function
    #39651655
ArchiSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Почему не работает следующий код (когда вызываю табличную функцию в селекте, пишет inconsistent datatype), если переменной курсора в пакете не указывать конкретную секцию return:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
-- object type declaration (schema level)
create or replace type t_emp_ob is object (
       empno_ob number(4),
       ename_ob varchar2(10)
);
--------------
-- nested table declaration (schema level)
create or replace type t_emp_nt is table of t_emp_ob;
--------------
-- ref cursor declaration (package level)
create or replace package refcur_ptf_pkg
is
       type refcur_ptf is ref cursor;
end refcur_ptf_pkg;



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
create or replace function tf_doesnt_work (dataset in refcur_ptf_pkg.refcur_ptf) 
return t_emp_nt 
is
   type dataset_tt is table of t_emp_ob index by pls_integer;
   l_dataset dataset_tt;
   retval t_emp_nt := t_emp_nt();
begin
  fetch dataset bulk collect into l_dataset;
  
  for l_row in l_dataset.first .. l_dataset.last loop
    retval.extend;
    retval(retval.last) := t_emp_ob(l_dataset(l_row).empno_ob, l_dataset(l_row).ename_ob);
  end loop;
  
  close dataset;
  return retval;
end;



Код: plsql
1.
2.
3.
-- Doesn't work
select *
from table(tf_doesnt_work(cursor(select empno, ename from regrep.emp)));
...
Рейтинг: 0 / 0
Pipeline table function
    #39651664
ArchiSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic,

Спасибо! Получилось, пошел последовательный вывод с задержкой. Сейчас буду гуглить про fetch_size (array_size)
...
Рейтинг: 0 / 0
Pipeline table function
    #39651724
ArchiSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ArchiSQLПочему не работает следующий код (когда вызываю табличную функцию в селекте, пишет inconsistent datatype), если переменной курсора в пакете не указывать конкретную секцию return:


По этому вопросу ни у кого нет идей?
...
Рейтинг: 0 / 0
Pipeline table function
    #39651741
ArchiSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ElicArchiSQLпочему pipeline table function возвращает всю выборку целиком, а не каждую строку в отдельности с интервалом в 1 сек.Потому что есть такое понятие как fetch_size (array_size).
Запускай свой запрос в SQL*Plus-е после
Код: plsql
1.
set arraysize 1



Кстати, интересное поведение, сначала выводится одна запись, затем 2с перерыв, затем вывод двух записей, затем опять 2с перерыв, вывод двух записей и тд.
По идее pipe row выводит запись, буфер в PGA очищается, затем 1 с перерыв, затем происходит заполнение буфера и его вывод, очищение и опять 1 с ожидание.
Откуда могут взяться 2 сек ожидание?
...
Рейтинг: 0 / 0
Pipeline table function
    #39651746
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArchiSQLОткуда могут взяться 2 сек ожидание?Не бери до головы. всякие prefetch-и и т.п.
...
Рейтинг: 0 / 0
Pipeline table function
    #39651847
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArchiSQLArchiSQLПочему не работает следующий код (когда вызываю табличную функцию в селекте, пишет inconsistent datatype), если переменной курсора в пакете не указывать конкретную секцию return:

По этому вопросу ни у кого нет идей?
Код: plsql
1.
2.
3.
(dataset in refcur_ptf_pkg.refcur_ptf)
изложите в виде 
(dataset in SYS_REFCURSOR)
...
Рейтинг: 0 / 0
Pipeline table function
    #39651862
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ArchiSQLКстати, интересное поведение, сначала выводится одна запись, затем 2с перерыв, затем вывод двух записей, затем опять 2с перерыв, вывод двух записей и тд.
По идее pipe row выводит запись, буфер в PGA очищается, затем 1 с перерыв, затем происходит заполнение буфера и его вывод, очищение и опять 1 с ожидание.
Откуда могут взяться 2 сек ожидание?
https://www.spotonoracle.com/?p=303
Создай oraaccess.xml в папке где у тебя tnsnames.ora c таким содержимым:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
<?xml version="1.0"?>
 <oraaccess xmlns="http://xmlns.oracle.com/oci/oraaccess"
            xmlns:oci="http://xmlns.oracle.com/oci/oraaccess"
            schemaLocation="http://xmlns.oracle.com/oci/oraaccess http://xmlns.oracle.com/oci/oraaccess.xsd">
  <default_parameters>
    <prefetch>
      <rows>0</rows>
    </prefetch>
  </default_parameters>
</oraaccess>
...
Рейтинг: 0 / 0
Pipeline table function
    #39651907
ArchiSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymousArchiSQLпропущено...

По этому вопросу ни у кого нет идей?
Код: plsql
1.
2.
3.
(dataset in refcur_ptf_pkg.refcur_ptf)
изложите в виде 
(dataset in SYS_REFCURSOR)



Не помогло, все тот же эррор - inconsistent datatypes. Затык на этой строчке:
Код: plsql
1.
fetch dataset bulk collect into l_dataset;
...
Рейтинг: 0 / 0
Pipeline table function
    #39651910
ArchiSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xtender, Elic
Спасибо, теперь понятно)
...
Рейтинг: 0 / 0
Pipeline table function
    #39651913
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArchiSQLвсе тот же эррор
Ну дык ить кто будет за Вас t_emp_ob -то конструировать?
...
Рейтинг: 0 / 0
Pipeline table function
    #39651922
ArchiSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymousArchiSQLвсе тот же эррор
Ну дык ить кто будет за Вас t_emp_ob -то конструировать?

Прошу прощения, немного не понял, что Вы хотели сказать)
У меня такой код:

Код: 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.
-- object type declaration (schema level)
create or replace type t_emp_ob is object (
       empno_ob number(4),
       ename_ob varchar2(10)
);

--------------
-- nested table declaration (schema level)
create or replace type t_emp_nt is table of t_emp_ob;
--------------
-- ref cursor declaration (package level)
create or replace package refcur_ptf_pkg
is
       type refcur_ptf is ref cursor;
end refcur_ptf_pkg;
-------------- ******************************


create or replace function tf_doesnt_work (dataset in SYS_REFCURSOR/*refcur_ptf_pkg.refcur_ptf*/) 
return t_emp_nt 
is
   type dataset_tt is table of t_emp_ob index by pls_integer;
   l_dataset dataset_tt;
   retval t_emp_nt := t_emp_nt();
begin
  fetch dataset bulk collect into l_dataset;
  
  for l_row in l_dataset.first .. l_dataset.last loop
    retval.extend;
    retval(retval.last) := t_emp_ob(l_dataset(l_row).empno_ob, l_dataset(l_row).ename_ob);
  end loop;
  
  close dataset;
  return retval;
end;

-- Doesn't work
select *
from table(tf_doesnt_work(cursor(select empno, ename from regrep.emp)));
...
Рейтинг: 0 / 0
Pipeline table function
    #39651955
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
> create or replace type t_emp_ob as object (
       empno_ob number,
       ename_ob varchar2(25)
)
/

TYPE T_EMP_OB compiled

> -- nested table declaration (schema level)
> create or replace type t_emp_nt as table of t_emp_ob
/

TYPE T_EMP_NT compiled

> create or replace function tf_doesnt_work (dataset in SYS_REFCURSOR/*refcur_ptf_pkg.refcur_ptf*/) 
return t_emp_nt 
is
   l_dataset t_emp_nt;
begin
  fetch dataset bulk collect into l_dataset;
  close dataset;
  return l_dataset;
end;
/

FUNCTION TF_DOESNT_WORK compiled

> -- Doesn't work
> select *
from table(tf_doesnt_work(cursor(select t_emp_ob(object_id, object_name) from user_objects where rownum < 5)))
;

  EMPNO_OB ENAME_OB                
---------- -------------------------
    174889 ACN_ACC                   
    174891 ACN_ACC_KNOT              
    174893 ACN_AGREE                 
    174895 ACN_AGREE_PARAM       
...
Рейтинг: 0 / 0
Pipeline table function
    #39652177
ArchiSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous,

Спасибо, работает) Начал читать статьи в блоге Фейштейна на тему табличных функций, очень интересно, но в голове пока нет четкого понимания, надеюсь скоро появится)
...
Рейтинг: 0 / 0
Pipeline table function
    #39652230
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArchiSQL,

пока понятие появится, оракля "упростит" до mssql-я

была кляуза THE и нет ее , в 18-ке можно без table
select * from sys.odcinumberlist(1,2,3)

......
stax
...
Рейтинг: 0 / 0
Pipeline table function
    #39652238
ArchiSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,

упростит или нет и когда это будет - я не знаю и от меня это не зависит, а уверенно работать с табличным функциями как джуниору pl\sql рвущемуся в мидлы - нужно уже сейчас))
...
Рейтинг: 0 / 0
Pipeline table function
    #39652259
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArchiSQLуверенно работать с табличным функциями как джуниору pl\sql рвущемуся в мидлы
Этот сценарий подразумевает более глубокое знакомство с pl/sql вообще и с его объектным расширением в частности.
Чтите девелопер гайды - в Вашем случае актуально.
...
Рейтинг: 0 / 0
Pipeline table function
    #39652274
ArchiSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous,

Спасибо за совет, прислушаюсь. Сейчас прочел больше половины книги Фейштейн, Прибыл "Oracle PL SQL для профессионалов", но там мало практических примеров по тем же табличным функциям, динамическому SQL (особенно хочется попрактиковать DBMS_SQL, так как намного менее понятен в теории чем NDS), поэтому сейчас читаю статьи Фейштейна на выбранные темы. Документацию на сайте оракла читаю менее интенсивно, но после прочтения книги переключусь на нее.
...
Рейтинг: 0 / 0
Pipeline table function
    #39652525
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArchiSQLстатьи Фейштейна на выбранные темы. Документацию на сайте оракла читаю менее интенсивно, но после прочтения книги переключусь на нее.
Вообще статьи уважаемых авторов лучше читать _после гайдов от вендора.
Причина - авторы пишут на базе собственного опыта и практики в определенных областях, гайды же дают более полный и детальный обзор предоставляемых вендором инструментов.
...
Рейтинг: 0 / 0
Pipeline table function
    #39652988
ArchiSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymousВообще статьи уважаемых авторов лучше читать _после гайдов от вендора.
Причина - авторы пишут на базе собственного опыта и практики в определенных областях, гайды же дают более полный и детальный обзор предоставляемых вендором инструментов.

Логически это понятно. Просто гайды более скучные что-ли. Статьи же наполнены "жизненными ситуациями" если так можно выразиться, кроме того очень интересно читать комментарии к статьям. Но конечно же это не отменяет того факта, что лучше сначала гайды, потом статьи.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Pipeline table function
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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