powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / NO_DATA_NEEDED aka ORA-06548
23 сообщений из 23, страница 1 из 1
NO_DATA_NEEDED aka ORA-06548
    #36587586
Фотография suPPLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот такая штука: NO_DATA_NEEDED . Вроде и документированная , но на форуме я её только в одном топике встретил - да и там это был grep по $ORACLE_HOME/rdbms/admin/* в поиске предопределённых сообщений.

Кто-то использует?

Вкратце, копипаст блога Кайта
Код: plaintext
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.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
SQL> create or replace function
  2   generate_data( n in number )
  3   return sys.odciNumberList
  4   PIPELINED
  5   as
  6   begin
  7       dbms_output.put_line
  8       ( '===>>> INITIALIZE' );
  9       for i in  1 ..generate_data.n
 10       loop
 11           dbms_output.put_line
 12           ( '===>>> PROCESS' );
 13           pipe row(i);
 14       end loop;
 15       dbms_output.put_line
 16       ( '===>>> CLEAN UP' );
 17       return;
 18   end;
 19   /

Function created.

SQL> select *
  2     from table(generate_data( 2 ))
  3    where rownum =  1 ;

COLUMN_VALUE
------------
           1 

===>>> INITIALIZE
===>>> PROCESS

SQL> create or replace function
  2   generate_data( n in number )
  3   return sys.odciNumberList
  4   PIPELINED
  5   as
  6   begin
  7       dbms_output.put_line
  8       ( '===>>> INITIALIZE' );
  9       for i in  1 ..generate_data.n
 10       loop
 11           dbms_output.put_line
 12           ( '===>>> PROCESS' );
 13           pipe row(i);
 14       end loop;
 15       dbms_output.put_line
 16       ( '===>>> CLEAN UP' );
 17       return;
 18   exception
 19       when no_data_needed
 20       then
 21           dbms_output.put_line
 22           ( '***>>> CLEAN UP' );
 23           return;
 24   end;
 25   /

Function created.

SQL> select *
  2     from table(generate_data( 2 ))
  3    where rownum =  1 ;

COLUMN_VALUE
------------
           1 

===>>> INITIALIZE
===>>> PROCESS
***>>> CLEAN UP

-------------------------------------------------------
When I say "RTFM" or "STFF" or "STFW",
the third letter means "Following" or "Fine"...
...
Рейтинг: 0 / 0
NO_DATA_NEEDED aka ORA-06548
    #36588770
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
suPPLer,
Я думаю, прежде всего надо отталкиваться от целевого назначения pipelined.
Это функции возвращающие наборы данных, при этом, их можно использовать как на клиенте так и в запросах. Далее, потому как вернуть на клиент набор данных есть еще масса вариантов, то по-моему pipelined придуманы для того, чтоб можно было сделать прежде всего select результата.
Кроме того подразумевается, что функция целиком реализует некоторую логику, согласно которой и возвращает набор данных. То есть является неким целым.
В связи с чем, довольно проблематично представить ситуацию, при которой возникает необходимость оборвать работу функции.

Более того, поскольку коллекции работают быстрее, я вообще в продакшене pipelined не использую:
source code
Код: plaintext
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.
44.
45.
46.
47.
48.
CREATE OR REPLACE FUNCTION generate_data(n IN NUMBER)
    RETURN sys.odcinumberlist
    PIPELINED AS
BEGIN
    FOR i IN (SELECT object_id
                FROM (SELECT object_id,
                             row_number() over(ORDER BY object_id) rn
                        FROM all_objects)
               WHERE rn <=  32000 )
    LOOP
        PIPE ROW(i.object_id);
    END LOOP;
END;
/

CREATE OR REPLACE FUNCTION generate_data2(n IN NUMBER)
    RETURN sys.odcinumberlist AS
    RESULT sys.odcinumberlist;
BEGIN
    SELECT object_id BULK COLLECT
      INTO RESULT
      FROM (SELECT object_id, row_number() over(ORDER BY object_id) rn
              FROM all_objects)
     WHERE rn <=  32000 ;
    RETURN RESULT;
END;
/

DECLARE
	t TIMESTAMP;
	s NUMBER;
BEGIN
	t := systimestamp;
	FOR i IN  1  ..  10 
	LOOP
		SELECT SUM(column_value) INTO s FROM TABLE(generate_data( 32000 ));
	END LOOP;
	dbms_output.put_line(systimestamp - t);
	dbms_output.put_line(s);

	t := systimestamp;
	FOR i IN  1  ..  10 
	LOOP
		SELECT SUM(column_value) INTO s FROM TABLE(generate_data2( 32000 ));
	END LOOP;
	dbms_output.put_line(systimestamp - t);
	dbms_output.put_line(s);
END;
/

Код: plaintext
1.
2.
3.
+ 000000000   00 : 00 : 20 . 938000000 
 698002300 
+ 000000000   00 : 00 : 17 . 188000000 
 698002300 
Код: plaintext
1.
2.
3.
4.
SQL> SELECT round( 100  * ( 1  -  17188  /  20938 ),  2 ) x FROM dual;
 
         X
----------
      17 , 91 
Думаю выигрыш почти в 18% является серьезным подспорьем для использования колеекций против pipelined.
Но для pipelined имеется два преимущества:
1) не надо создавать тип результата (весьма сомнительно поскольку обычно возвращается просто коллекция чисел)
2) можно обрывать выполнение по NO_DATA_NEEDED (весьма сомнительно в принципе :))

Откуда у меня возникает более общий вопрос: кто-либо вообще искользует pipelined в продакшене?
...
Рейтинг: 0 / 0
NO_DATA_NEEDED aka ORA-06548
    #36588787
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshop
Думаю выигрыш почти в 18% является серьезным подспорьем для использования колеекций против pipelined.
...
Откуда у меня возникает более общий вопрос: кто-либо вообще искользует pipelined в продакшене?
18% - это не на порядок.
а тестик Ваш миллионах на 30 записей погоняйте, причем желательно возвращать более-менее пристойного размера строки.
используем и будем использовать :)
...
Рейтинг: 0 / 0
NO_DATA_NEEDED aka ORA-06548
    #36588815
wildwind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshop,

ЕМНИП когда pipelined появились, появились они в основном для ETL. А там источники-файлы и все вытекающие (0 записей, учечка ресурсов и т.д.) обычное дело.
...
Рейтинг: 0 / 0
NO_DATA_NEEDED aka ORA-06548
    #36589091
Фотография suPPLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopЯ думаю, прежде всего надо отталкиваться от целевого назначения pipelined.

Ну что ж, давайте. :) PIPELINED-функции, появившиеся в 9i, расширяли возможность обращаться к функциям как к таблицам в запросе. Вы уже упомянули про табличные функции, возвращающие коллекции. Эти функции хороши там, где результат нужен целиком и сразу, потому что они сохраняют результат в коллекцию перед тем, как отдать хотя бы одну строку из возвращаемой таблицы. Но чтобы получить эту первую строку, нужно дождаться, пока будет обработана вся таблица. Кроме того, параллелизм к запросу данных из такой функции не приделаешь.

Конвейерные функции позволяют:
- получить строку, когда она будет готова. В условиях больших объёмов обрабатываемых данных, занимающих время алгоритмов обработки строк и нескольких этапов обработки это довольно важно.
- распараллелить обработку строк функцией. Например, при вставке результатов вида INSERT SELECT FROM PIPELINED FUNCTION или их последующей обработке другой функцией. Как такое легко получить при помощи табличных функций, возвращающих коллекции, я пока не задумывался. :) Почему-то кажется, что это не легко, если возможно.
- кроме того, экономия используемой памяти. Вся коллекция не нужна, хватит только той части, которая будет возвращаться из функции. Строки возвращаются пачками для увеличения эффективности, что немного разбавляет первое заявленное преимущество. :)
- модульный подход - все необходимые типы (строго типизированные ссылочные курсоры, типы используемых записей и возвращаемых pl/sql-коллекций) и использующие их конвейерные функции можно собрать в одном пакете.
- ну, и заявленное в сабже исключение позволяет корректно освободить ресурсы и завершить процесс обработки в определённых ситуациях.

Одна из основных областей использования конвейерных функций - этап TRANSFORM в ETL-процессах. Например, функция, обрабатывающая таблицу-результат функции, обрабатывающей таблицу-результат функции, ..., обрабатывающей ссылочный курсор с запросом, из внешней таблицы. Поверьте, этот подход используется и хорошо себя зарекомендовал.

PS: Кстати, в продакшене, тесте и разработке довольно часто используются конвейерные функции. Подсказать где? :)
PPS: Что-то по сабжу все отмолчались... Мне вот пока использовать не довелось, хотя наличие способа, конечно, душу греет.
...
Рейтинг: 0 / 0
NO_DATA_NEEDED aka ORA-06548
    #36589094
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
suPPLerМне вот пока использовать не довелось, хотя наличие способа, конечно, душу греет.Да вот поэтому и отмолчались
Фишка есть, это радует, но в обычных ситуациях и нахрен не нужна
...
Рейтинг: 0 / 0
NO_DATA_NEEDED aka ORA-06548
    #36589306
Фотография JaRo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
suPPLerPPS: Что-то по сабжу все отмолчались... Мне вот пока использовать не довелось, хотя наличие способа, конечно, душу греет.Думаю, что практически все, как Кайт или Jeff Kemp - с этим не сталкивались..
При прочтении думаешь - классно, надо поиспользовать, а потом задумываешься и понимаешь, что как-то необходимости до сих пор не возникало и возникнет ли.. Но интересно.
...
Рейтинг: 0 / 0
NO_DATA_NEEDED aka ORA-06548
    #36589565
comphead
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaRo,

+1. присодиняюсь к Jeff Kemp. он в принципе дает понять, что совсем не очевидно, что это исключение вообще когда нибудь будет возбуждено.

у меня такое ощущение, будто это исключение придумано на какое то далекое будущее и попало в релиз "сквозь пальцы"
...
Рейтинг: 0 / 0
NO_DATA_NEEDED aka ORA-06548
    #36589644
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зачем может понадобиться пост-обработка? может быть масса причин, связанных с корректным освобождением временных и внешних ресурсов. Если вы ее делаете после END LOOP, нужно не забывать и про прерывания запросов.
...
Рейтинг: 0 / 0
NO_DATA_NEEDED aka ORA-06548
    #36591083
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousа тестик Ваш миллионах на 30 записей погоняйте, причем желательно возвращать более-менее пристойного размера строки.
используем и будем использовать :)
Почитал про преимущества , понял к чему вы клоните.
А что вы использовали до появления pipelined?
...
Рейтинг: 0 / 0
NO_DATA_NEEDED aka ORA-06548
    #36591248
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopА что вы использовали до появления pipelined?
Если речь идет о тех ситуациях когда "голый" sql не очень удобен - то циклы pl/sql (bulk collect into... LIMIT x).
А до bulk collect - обычный курсорный цикл либо dbms_sql.
...
Рейтинг: 0 / 0
NO_DATA_NEEDED aka ORA-06548
    #36592200
Фотография suPPLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за ответы, я приблизительно так и оценивал распространённость использования этой фичи.

PS: suPPLerКстати, в продакшене, тесте и разработке довольно часто используются конвейерные функции. Подсказать где? :)
Я думаю, это Вам известно, но тем не менее - dbms_xplan.display%. :)
...
Рейтинг: 0 / 0
NO_DATA_NEEDED aka ORA-06548
    #36592207
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
suPPLerЯ думаю, это Вам известно, но тем не менееА я скоро забуду, наверное :)
Код: plaintext
SQL> @plan
...
Рейтинг: 0 / 0
NO_DATA_NEEDED aka ORA-06548
    #36592240
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
suPPLersuPPLerКстати, в продакшене , тесте и разработке довольно часто используются конвейерные функции. Подсказать где? :)
Я думаю, это Вам известно, но тем не менее - dbms_xplan.display%. :)Вопрос у меня стоял именно про то, что выделено.
И если Вы "довольно часто" используете в продакшене этот функционал, думаю что-то не ладно в Вашем королевстве.
Ну и есс-но инетересовали самописные pipelined функции. :)

з.ы. Впрочем после ответов Андрея и обсуждения на АскТом инетерес у меня уже не такой острый, т.к. понял, что функционал действительно имеет право на жизнь. Просто я лет пять назад сделал выбор в пользу коллекций (уже точно не помню всех "за" и "против") и решил снова сопоставить.
...
Рейтинг: 0 / 0
NO_DATA_NEEDED aka ORA-06548
    #36592283
Фотография suPPLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopИ если Вы "довольно часто" используете в продакшене этот функционал, думаю что-то не ладно в Вашем королевстве.
Toucher, mon ami!
...
Рейтинг: 0 / 0
NO_DATA_NEEDED aka ORA-06548
    #36592354
Фотография orawish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
даже
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SQL> select *
   2     from table(generate_data( 1 ))
   3    where rownum =  1 ;

COLUMN_VALUE
------------
            1 

===>>> INITIALIZE
===>>> PROCESS
***>>> CLEAN UP

что логично
...
Рейтинг: 0 / 0
NO_DATA_NEEDED aka ORA-06548
    #36592643
Фотография orawish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а по части
suPPLer..

Кто-то использует?

так это штука критическая для тех, кто прётся от пайплайнов на версиях (9i.?), которые
жить не могут без return-a в конце ея.
...
Рейтинг: 0 / 0
NO_DATA_NEEDED aka ORA-06548
    #36592786
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос скорее зачем отличать OTHERS от NO_DATA_NEEDED. Например, чтобы не делать retry on error, когда ошибка заведомо не ошибка. Или, в случае фатальной ошибки, сохранить используемый процессом временный файл для последующего разбора проблемы, а в случае stop key/user canceled request не сохранять.
...
Рейтинг: 0 / 0
NO_DATA_NEEDED aka ORA-06548
    #36592830
comphead
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-Вопрос скорее зачем отличать OTHERS от NO_DATA_NEEDED. Например, чтобы не делать retry on error, когда ошибка заведомо не ошибка. Или, в случае фатальной ошибки, сохранить используемый процессом временный файл для последующего разбора проблемы, а в случае stop key/user canceled request не сохранять.

т.е. получается что NO_DATA_NEEDED не возбуждается из самого оракла, а создано для удобной обработки каких то ситуации, которые определяет сам разработчик.?
...
Рейтинг: 0 / 0
NO_DATA_NEEDED aka ORA-06548
    #36594063
wildwind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
compheadполучается что NO_DATA_NEEDED не возбуждается из самого оракла, а создано для удобной обработки каких то ситуации, которые определяет сам разработчик.?
Возбуждается из самого Оракла. И в то же время создано для удобной обработки ситуаций ...

Если вспомнить другой способ реализации табличных функций, через интерфейс ODCITable, то NO_DATA_NEEDED это "аналог" ODCITableClose.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
NO_DATA_NEEDED aka ORA-06548
    #39272799
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хм...
перешли с 11.2.0.3 на 11.2.0.4, получили субжом в морду

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
-- ORA-06548: больше строк не требуется
SELECT DISTINCT
       n.pred kod
  FROM n
 WHERE n.holding IN (SELECT TRIM (str)
                       FROM THE (SELECT CAST (GET_SPIS_VARCHAR ( :p_holding) AS varchar_table) FROM DUAL));

-- так уже ошибки нет
SELECT DISTINCT
       n.pred kod
  FROM n
 WHERE n.holding IN (SELECT TRIM (str)
                       FROM TABLE(GET_SPIS_VARCHAR ( :p_holding)));
...
Рейтинг: 0 / 0
NO_DATA_NEEDED aka ORA-06548
    #39272901
Фотография suPPLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx,

T. KyteIt is deprecated syntax from version 8.0

Может, пришло всё же время на TABLE переходить?
...
Рейтинг: 0 / 0
NO_DATA_NEEDED aka ORA-06548
    #39272926
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
suPPLerandreymx,

T. KyteIt is deprecated syntax from version 8.0

Может, пришло всё же время на TABLE переходить?как запросы правим в порядке сопровожения, так корректируем

ЗЫ: добавил в функцию обработку
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
       BEGIN
          pipe ROW(spis_varchar(TO_CHAR(TRIM(p_spis))));
          RETURN;
       EXCEPTION 
          WHEN no_data_needed THEN
               -- dbms_put.put_line('Get_Spis_Varchar: ' || SQLERRM);
               RETURN;
       END;
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / NO_DATA_NEEDED aka ORA-06548
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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