Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Update от PIPELINED функции  [new]
4uko
Member

Откуда:
Сообщений: 276
UPDATE doc_detail dd
   SET (dd.date_of_move_out, dd.date_of_move_in) =
          (SELECT cdd.date_of_move_out, cdd.date_of_move_in
             FROM TABLE
                     (CAST
                         (document_management.move_equipment_max_date AS ct_doc_header_detail
                         )
                     ) cdd
            WHERE dd.ID = cdd.doc_detail_id)
Ошибка: Функия не вернула значения
Хотя
SELECT COUNT (*)
  FROM TABLE
          (CAST
              (document_management.move_equipment_max_date AS ct_doc_header_detail
              )
          )
вернул 140127.

Вопрос: Апдейт возможен ?
28 ноя 06, 17:57    [3463629]     Ответить | Цитировать Сообщить модератору
 Re: Update от PIPELINED функции  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Вызываем update из функции?
28 ноя 06, 18:03    [3463661]     Ответить | Цитировать Сообщить модератору
 Re: Update от PIPELINED функции  [new]
4uko
Member

Откуда:
Сообщений: 276
Jannny
Вызываем update из функции?

Сожалею, но непонял Вашего вопроса ?
28 ноя 06, 18:05    [3463674]     Ответить | Цитировать Сообщить модератору
 Re: Update от PIPELINED функции  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116133
Какая то ошибка у Вас странная...
Вы RETURN в функции не забыли ?
28 ноя 06, 18:06    [3463680]     Ответить | Цитировать Сообщить модератору
 Re: Update от PIPELINED функции  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
4uko
Jannny
Вызываем update из функции?

Сожалею, но непонял Вашего вопроса ?
Давайте так:
бросайте сюда из Плюса сам апдейт + реакция Оракла.
28 ноя 06, 18:07    [3463682]     Ответить | Цитировать Сообщить модератору
 Re: Update от PIPELINED функции  [new]
4uko
Member

Откуда:
Сообщений: 276
dmidek
Какая то ошибка у Вас странная...
Вы RETURN в функции не забыли ?

RETURN точно есть!!
Наверно если бы его небыло то и COUNT не прошол бы
28 ноя 06, 18:09    [3463697]     Ответить | Цитировать Сообщить модератору
 Re: Update от PIPELINED функции  [new]
4uko
Member

Откуда:
Сообщений: 276
Connected to:
Oracle9i Enterprise Edition Release 9.2.0.7.0 - 64bit Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.7.0 - Production

SQL> BEGIN
  2     set_stock ('200');   -- caiieie oaae neeaaia
  3     set_equipment ('-1');   -- caiieie oaae iai?oa
  4     stock_management.move_equipment_zero_quantity (SYSDATE);
  5  END;
  6  /

PL/SQL procedure successfully completed.

SQL>    SELECT COUNT (*)
  2    FROM TABLE
  3            (CAST
  4                (document_management.move_equipment_max_date AS ct_doc_header
_detail
  5                )
  6            )
  7  /

  COUNT(*)
----------
    140127

SQL> UPDATE doc_detail dd
  2     SET (dd.date_of_move_out, dd.date_of_move_in) =
  3            (SELECT cdd.date_of_move_out, cdd.date_of_move_in
  4               FROM TABLE
  5                       (CAST
  6                           (document_management.move_equipment_max_date AS ct
_doc_header_detail
  7                           )
  8                       ) cdd
  9              WHERE dd.ID = cdd.doc_detail_id)
 10   WHERE EXISTS (
 11            SELECT *
 12              FROM TABLE
 13                      (CAST
 14                          (document_management.move_equipment_max_date AS ct_
doc_header_detail
 15                          )
 16                      ) cdd
 17             WHERE dd.ID = cdd.doc_detail_id)
 18  /
                        (document_management.move_equipment_max_date AS ct_doc_h
eader_detail
                         *
ERROR at line 14:
ORA-06503: PL/SQL: Function returned without value
ORA-06512: at "NEWSTOCK.DOCUMENT_MANAGEMENT", line 4131


SQL>

28 ноя 06, 18:15    [3463723]     Ответить | Цитировать Сообщить модератору
 Re: Update от PIPELINED функции  [new]
4uko
Member

Откуда:
Сообщений: 276
я sqlplus через cmd использую поэтому извиняюсь за ворматирование
28 ноя 06, 18:17    [3463730]     Ответить | Цитировать Сообщить модератору
 Re: Update от PIPELINED функции  [new]
vallkor
Member

Откуда: Киев
Сообщений: 162
Что возвращает вот эта хрень?

select dd.id, cdd.id
  from doc_detail dd,
         (SELECT cdd.date_of_move_out, cdd.date_of_move_in
          FROM TABLE
                (CAST
                  (document_management.move_equipment_max_date AS ct_doc_header_detail)
         ) cdd
WHERE dd.ID = cdd.doc_detail_id (+) AND
          cdd.doc_detail_id is null
28 ноя 06, 18:19    [3463743]     Ответить | Цитировать Сообщить модератору
 Re: Update от PIPELINED функции  [new]
4uko
Member

Откуда:
Сообщений: 276
Сама функция
FUNCTION move_equipment_max_date
   RETURN ct_doc_header_detail PARALLEL_ENABLE PIPELINED
AS
   l_tab   ot_doc_header_detail;
BEGIN
   --Âûáåðèì âñå äîêóìåíòû â êîòîðûõ ïðèñóòñâóåò îáîðóäîâàíèå ñ ïîñëåäíåé äàòîé äâèæåíèÿ
   FOR cur_doc IN (SELECT ....)
   LOOP
      l_tab :=
         ot_doc_header_detail (NULL,   --cur_doc.doc_header_id
                               cur_doc.doc_detail_id,
                               cur_doc.max_doc_date,
                               NULL,   --equipment_model_id
                               NULL,   --seria_start
                               NULL,   --seria_end
                               cur_doc.stock_in_id,
                               cur_doc.stock_out_id,
                               NULL,   --equipment_batch_id
                               NULL,   --date_of_move_out
                               NULL   --date_of_move_in
                              );

      IF (cur_doc.stock_id = cur_doc.stock_out_id OR cur_doc.stock_out_id = 0
         )
      THEN
         l_tab.date_of_move_out := cur_doc.max_doc_date;
      END IF;

      IF (cur_doc.stock_id = cur_doc.stock_in_id OR cur_doc.stock_in_id = 0)
      THEN
         l_tab.date_of_move_in := cur_doc.max_doc_date;
      END IF;

      PIPE ROW (l_tab);
   END LOOP;

   pkg_db_util.DEBUG (pkg_name || prc_name || ' END', pkg_name);
   --Âåðíåì ðåçóëüòàò
   RETURN;
EXCEPTION
   WHEN OTHERS
   THEN
      pkg_db_util.DEBUG (SUBSTR (pkg_name || prc_name || ':' || SQLERRM,
                                 1,
                                 255
                                ),
                         pkg_name
                        );
      pkg_db_util.debug_off (pkg_name);
END move_equipment_max_date;

28 ноя 06, 18:20    [3463752]     Ответить | Цитировать Сообщить модератору
 Re: Update от PIPELINED функции  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Ну говорит он Вам открыто - RETURN у Вас нет в функции. Проверьте, всегда ли он будет, например, нет ли в функции такого куска(подобного естественно ):

exeption
when others then null;
end;
28 ноя 06, 18:21    [3463761]     Ответить | Цитировать Сообщить модератору
 Re: Update от PIPELINED функции  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Вот-вот ;)
28 ноя 06, 18:22    [3463771]     Ответить | Цитировать Сообщить модератору
 Re: Update от PIPELINED функции  [new]
4uko
Member

Откуда:
Сообщений: 276
vallkor
Что возвращает вот эта хрень?

select dd.id, cdd.id
  from doc_detail dd,
         (SELECT cdd.date_of_move_out, cdd.date_of_move_in
          FROM TABLE
                (CAST
                  (document_management.move_equipment_max_date AS ct_doc_header_detail)
         ) cdd
WHERE dd.ID = cdd.doc_detail_id (+) AND
          cdd.doc_detail_id is null

Я немного исправил (у вас скобки нехватало)
SELECT dd.ID, b.doc_detail_id
  FROM doc_detail dd,
       (SELECT a.doc_detail_id, a.date_of_move_out, a.date_of_move_in
          FROM TABLE
                  (CAST
                      (document_management.move_equipment_max_date AS ct_doc_header_detail
                      )
                  ) a) b
 WHERE dd.ID = b.doc_detail_id(+) AND b.doc_detail_id IS NULL
/
вернуло
ID DOC_DETAIL_ID
375121
313653
388094
340484
245169
30752
358745
194442

и тп
Действительно нет значений
28 ноя 06, 18:28    [3463798]     Ответить | Цитировать Сообщить модератору
 Re: Update от PIPELINED функции  [new]
4uko
Member

Откуда:
Сообщений: 276
Неправильно у меня реконект был сейчас попробую еще
28 ноя 06, 18:30    [3463808]     Ответить | Цитировать Сообщить модератору
 Re: Update от PIPELINED функции  [new]
vallkor
Member

Откуда: Киев
Сообщений: 162
4uko

Я немного исправил (у вас скобки нехватало)

skiped

вернуло
ID DOC_DETAIL_ID
375121
313653
388094
340484
245169
30752
358745
194442

и тп
Действительно нет значений


Вот и думайте! Скорее всего для указанных в первом столбце значений не возвращается значение из функции.
28 ноя 06, 18:30    [3463815]     Ответить | Цитировать Сообщить модератору
 Re: Update от PIPELINED функции  [new]
4uko
Member

Откуда:
Сообщений: 276
Вот полный текст с разными вариациями COUNT
SQL> BEGIN
  2     set_stock ('200');   -- caiieie oaae neeaaia
  3     set_equipment ('-1');   -- caiieie oaae iai?oa
  4     stock_management.move_equipment_zero_quantity (SYSDATE);
  5  END;
  6  /

PL/SQL procedure successfully completed.

SQL>
SQL> SELECT COUNT (*)
  2    FROM TABLE
  3            (CAST
  4                (document_management.move_equipment_max_date AS ct_doc_header
_detail
  5                )
  6            )
  7  /

  COUNT(*)
----------
    140127

SQL> SELECT COUNT (dd.ID)
  2    FROM doc_detail dd,
  3         (SELECT a.doc_detail_id, a.date_of_move_out, a.date_of_move_in
  4            FROM TABLE
  5                    (CAST
  6                        (document_management.move_equipment_max_date AS ct_do
c_header_detail
  7                        )
  8                    ) a) b
  9   WHERE dd.ID = b.doc_detail_id(+) AND b.doc_detail_id IS NULL
 10  /

COUNT(DD.ID)
------------
      206576

SQL> SELECT COUNT (b.doc_detail_id)
  2    FROM doc_detail dd,
  3         (SELECT a.doc_detail_id, a.date_of_move_out, a.date_of_move_in
  4            FROM TABLE
  5                    (CAST
  6                        (document_management.move_equipment_max_date AS ct_do
c_header_detail
  7                        )
  8                    ) a) b
  9   WHERE dd.ID = b.doc_detail_id(+) AND b.doc_detail_id IS NULL
 10  /

COUNT(B.DOC_DETAIL_ID)
----------------------
                     0

SQL> SELECT COUNT (dd.ID)
  2    FROM doc_detail dd,
  3         (SELECT a.doc_detail_id, a.date_of_move_out, a.date_of_move_in
  4            FROM TABLE
  5                    (CAST
  6                        (document_management.move_equipment_max_date AS ct_do
c_header_detail
  7                        )
  8                    ) a) b
  9   WHERE dd.ID = b.doc_detail_id(+) AND b.doc_detail_id IS not NULL
 10  /

COUNT(DD.ID)
------------
      140127

SQL> SELECT COUNT (b.doc_detail_id)
  2    FROM doc_detail dd,
  3         (SELECT a.doc_detail_id, a.date_of_move_out, a.date_of_move_in
  4            FROM TABLE
  5                    (CAST
  6                        (document_management.move_equipment_max_date AS ct_do
c_header_detail
  7                        )
  8                    ) a) b
  9   WHERE dd.ID = b.doc_detail_id(+) AND b.doc_detail_id IS not NULL
 10  /

COUNT(B.DOC_DETAIL_ID)
----------------------
                140127

SQL>
28 ноя 06, 18:45    [3463858]     Ответить | Цитировать Сообщить модератору
 Re: Update от PIPELINED функции  [new]
4uko
Member

Откуда:
Сообщений: 276
как видно менял только IS NULL на IS NOT NULL. Join есть а вот апдейт непроходит
28 ноя 06, 18:48    [3463869]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить