Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / NO_DATA_NEEDED aka ORA-06548 / 23 сообщений из 23, страница 1 из 1
20.04.2010, 13:34:12
    #36587586
suPPLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NO_DATA_NEEDED aka ORA-06548
Вот такая штука: 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
20.04.2010, 21:02:52
    #36588770
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NO_DATA_NEEDED aka ORA-06548
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
20.04.2010, 21:11:16
    #36588787
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NO_DATA_NEEDED aka ORA-06548
dbms_photoshop
Думаю выигрыш почти в 18% является серьезным подспорьем для использования колеекций против pipelined.
...
Откуда у меня возникает более общий вопрос: кто-либо вообще искользует pipelined в продакшене?
18% - это не на порядок.
а тестик Ваш миллионах на 30 записей погоняйте, причем желательно возвращать более-менее пристойного размера строки.
используем и будем использовать :)
...
Рейтинг: 0 / 0
20.04.2010, 21:31:51
    #36588815
wildwind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NO_DATA_NEEDED aka ORA-06548
dbms_photoshop,

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

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

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

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

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

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

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

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

з.ы. Впрочем после ответов Андрея и обсуждения на АскТом инетерес у меня уже не такой острый, т.к. понял, что функционал действительно имеет право на жизнь. Просто я лет пять назад сделал выбор в пользу коллекций (уже точно не помню всех "за" и "против") и решил снова сопоставить.
...
Рейтинг: 0 / 0
22.04.2010, 13:30:17
    #36592283
suPPLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NO_DATA_NEEDED aka ORA-06548
dbms_photoshopИ если Вы "довольно часто" используете в продакшене этот функционал, думаю что-то не ладно в Вашем королевстве.
Toucher, mon ami!
...
Рейтинг: 0 / 0
22.04.2010, 14:01:03
    #36592354
orawish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NO_DATA_NEEDED aka ORA-06548
даже
Код: 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
22.04.2010, 15:43:44
    #36592643
orawish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NO_DATA_NEEDED aka ORA-06548
а по части
suPPLer..

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

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

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

Если вспомнить другой способ реализации табличных функций, через интерфейс ODCITable, то NO_DATA_NEEDED это "аналог" ODCITableClose.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
13.07.2016, 09:22:08
    #39272799
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NO_DATA_NEEDED aka ORA-06548
хм...
перешли с 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
13.07.2016, 11:22:17
    #39272901
suPPLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NO_DATA_NEEDED aka ORA-06548
andreymx,

T. KyteIt is deprecated syntax from version 8.0

Может, пришло всё же время на TABLE переходить?
...
Рейтинг: 0 / 0
13.07.2016, 11:43:37
    #39272926
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NO_DATA_NEEDED aka ORA-06548
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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / NO_DATA_NEEDED aka ORA-06548 / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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