Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Pipeline table function / 21 сообщений из 21, страница 1 из 1
29.05.2018, 11:40
    #39651644
ArchiSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pipeline table function
Всем привет!
Подскажите, пожалуйста, почему 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
29.05.2018, 11:47
    #39651654
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pipeline table function
ArchiSQLпочему pipeline table function возвращает всю выборку целиком, а не каждую строку в отдельности с интервалом в 1 сек.Потому что есть такое понятие как fetch_size (array_size).
Запускай свой запрос в SQL*Plus-е после
Код: plsql
1.
set arraysize 1
...
Рейтинг: 0 / 0
29.05.2018, 11:48
    #39651655
ArchiSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pipeline table function
Почему не работает следующий код (когда вызываю табличную функцию в селекте, пишет 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
29.05.2018, 11:52
    #39651664
ArchiSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pipeline table function
Elic,

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


По этому вопросу ни у кого нет идей?
...
Рейтинг: 0 / 0
29.05.2018, 13:25
    #39651741
ArchiSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pipeline table function
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
29.05.2018, 13:28
    #39651746
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pipeline table function
ArchiSQLОткуда могут взяться 2 сек ожидание?Не бери до головы. всякие prefetch-и и т.п.
...
Рейтинг: 0 / 0
29.05.2018, 15:23
    #39651847
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pipeline table function
ArchiSQLArchiSQLПочему не работает следующий код (когда вызываю табличную функцию в селекте, пишет inconsistent datatype), если переменной курсора в пакете не указывать конкретную секцию return:

По этому вопросу ни у кого нет идей?
Код: plsql
1.
2.
3.
(dataset in refcur_ptf_pkg.refcur_ptf)
изложите в виде 
(dataset in SYS_REFCURSOR)
...
Рейтинг: 0 / 0
29.05.2018, 15:40
    #39651862
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pipeline table function
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
29.05.2018, 16:24
    #39651907
ArchiSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pipeline table function
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
29.05.2018, 16:25
    #39651910
ArchiSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pipeline table function
xtender, Elic
Спасибо, теперь понятно)
...
Рейтинг: 0 / 0
29.05.2018, 16:28
    #39651913
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pipeline table function
ArchiSQLвсе тот же эррор
Ну дык ить кто будет за Вас t_emp_ob -то конструировать?
...
Рейтинг: 0 / 0
29.05.2018, 16:36
    #39651922
ArchiSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pipeline table function
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
29.05.2018, 17:15
    #39651955
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pipeline table function
Код: 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
30.05.2018, 07:44
    #39652177
ArchiSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pipeline table function
andrey_anonymous,

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

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

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

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

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

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

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


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