Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Forall не работает  [new]
collect
Guest
create or replace package body pkg_UpdPrihNakl is
 
 cursor cur is select prih_nakl,productcode,lot from stm_0003 where 1=2;
 type t_stm is table of cur%rowtype;
 stm$ t_stm;

 procedure pr_IT_PrihNakl is
 begin
  select ls.prih_nakl,l.productcode,l.lot bulk collect into stm$          
                     from stm_0003 ls,stm_0003 l 
                     where ls.transactiontype='OV' and
                           l.lot = ls.lot and 
                           l.productcode = ls.productcode and 
                           l.transactiontype = 'IT' and 
                           trim(l.prih_nakl) is null; 

  forall i in stm$.first..stm$.last
    update stm_0003 st
     set st.prih_nakl = stm$(i)

    where st.lot = stm$(i) and 
          st.productcode = stm$(i);                       
 end; 

end pkg_UpdPrihNakl;

Доброго времени суток, вываливается по ошибке

Error: PLS-00382: expression is of wrong type

Я так понимаю не нравится сам апдейт, который подставляю в форалле, может кто-то подскажет почему?
29 апр 11, 19:50    [10589252]     Ответить | Цитировать Сообщить модератору
 Re: Forall не работает  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54384
collect,

а разве нужны не три разных массива как в примере?
CREATE OR REPLACE PROCEDURE fast_way IS

TYPE PartNum IS TABLE OF parent.part_num%TYPE
INDEX BY BINARY_INTEGER;
pnum_t PartNum;

TYPE PartName IS TABLE OF parent.part_name%TYPE
INDEX BY BINARY_INTEGER;
pnam_t PartName;

BEGIN
  SELECT part_num, part_name
  BULK COLLECT INTO pnum_t, pnam_t
  FROM parent;

  FOR i IN pnum_t.FIRST .. pnum_t.LAST
  LOOP
    pnum_t(i) := pnum_t(i) * 10;
  END LOOP;

  FORALL i IN pnum_t.FIRST .. pnum_t.LAST
  INSERT INTO child
  (part_num, part_name)
  VALUES
  (pnum_t(i), pnam_t(i));
  COMMIT;
END fast_way;
/
29 апр 11, 19:59    [10589265]     Ответить | Цитировать Сообщить модератору
 Re: Forall не работает  [new]
_Nikotin
Member

Откуда: СПб
Сообщений: 2965
collect

    where st.lot = stm$(i).lot and 
          st.productcode = stm$.productcode(i);                       
29 апр 11, 20:01    [10589270]     Ответить | Цитировать Сообщить модератору
 Re: Forall не работает  [new]
collect
Guest
Error: PLS-00436: implementation restriction: cannot reference fields of BULK In-BIND table of records

_Nikotin, в Вашем случае пишет такую вот ошибку
29 апр 11, 20:07    [10589286]     Ответить | Цитировать Сообщить модератору
 Re: Forall не работает  [new]
_Nikotin
Member

Откуда: СПб
Сообщений: 2965
collect,

теперь самое время узнать версию оракла :)
29 апр 11, 20:09    [10589290]     Ответить | Цитировать Сообщить модератору
 Re: Forall не работает  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18370
_Nikotin
collect,

теперь самое время узнать версию оракла :)

Самое время исправить пример :)
29 апр 11, 20:11    [10589296]     Ответить | Цитировать Сообщить модератору
 Re: Forall не работает  [new]
collect
Guest
Точно,

Oracle Database 10g Enterprise Edition Release 10.2.0.4.0
29 апр 11, 20:11    [10589298]     Ответить | Цитировать Сообщить модератору
 Re: Forall не работает  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18370
_Nikotin
collect

    where st.lot = stm$(i).lot and 
          st.productcode = stm$.productcode(i);                       
29 апр 11, 21:01    [10589440]     Ответить | Цитировать Сообщить модератору
 Re: Forall не работает  [new]
collect
Guest
Так как правильно? проверил и так и так не работает
29 апр 11, 21:09    [10589468]     Ответить | Цитировать Сообщить модератору
 Re: Forall не работает  [new]
_Nikotin
Member

Откуда: СПб
Сообщений: 2965
andrey_anonymous,

ну я уж не стал исправлять очевидную очепятку, к тому же на 10-ке только так как сказал andreymx :)
29 апр 11, 21:18    [10589493]     Ответить | Цитировать Сообщить модератору
 Re: Forall не работает  [new]
bdsm_sql
Member

Откуда:
Сообщений: 948
_Nikotin
andrey_anonymous,

ну я уж не стал исправлять очевидную очепятку, к тому же на 10-ке только так как сказал andreymx :)

на десятке workaround - объектный тип и TREAT
30 апр 11, 18:00    [10591125]     Ответить | Цитировать Сообщить модератору
 Re: Forall не работает  [new]
Victor Metelitsa
Member

Откуда: Тюмень
Сообщений: 2550
MERGE?
1 май 11, 14:31    [10592314]     Ответить | Цитировать Сообщить модератору
 Re: Forall не работает  [new]
Nyiala
Member

Откуда:
Сообщений: 3
правильно- st.lot = stm$(i).lot.
И здесь тоже: st.prih_nakl = stm$(i).prih_nakl
2 май 11, 16:43    [10595317]     Ответить | Цитировать Сообщить модератору
 Re: Forall не работает  [new]
bdsm_sql
Member

Откуда:
Сообщений: 948
Nyiala
правильно- st.lot = stm$(i).lot.
И здесь тоже: st.prih_nakl = stm$(i).prih_nakl

С ДОБРЫМ УТРОМ
2 май 11, 17:23    [10595400]     Ответить | Цитировать Сообщить модератору
 Re: Forall не работает  [new]
bdsm_sql
Member

Откуда:
Сообщений: 948
bdsm_sql
_Nikotin
andrey_anonymous,

ну я уж не стал исправлять очевидную очепятку, к тому же на 10-ке только так как сказал andreymx :)

на десятке workaround - объектный тип и TREAT

и чтобы не быть голословным
SQL> DROP TABLE forall_test PURGE;

Table dropped.

SQL> CREATE TABLE forall_test AS
  2  SELECT ROWNUM ID, 'text' DEF
  3  FROM dual CONNECT BY LEVEL < 11;

Table created.

SQL> CREATE OR REPLACE TYPE forall_test_t AS OBJECT(ID NUMBER, DEF VARCHAR2(10));
  2  /

Type created.

SQL> DECLARE
  2    TYPE tab_t IS TABLE OF forall_test_t;
  3    v_tab tab_t;
  4  BEGIN
  5    SELECT forall_test_t(ID, def) BULK COLLECT INTO v_tab FROM forall_test;
  6    FORALL i IN INDICES OF v_tab
  7      UPDATE forall_test
  8        SET def = v_tab(i).def
  9        WHERE ID = v_tab(i).id;
 10  END;
 11  /
      SET def = v_tab(i).def
                *
ERROR at line 8:
ORA-06550: line 8, column 17: 
PLS-00436: implementation restriction: cannot reference fields of BULK In-BIND 
table of records 
ORA-06550: line 9, column 18: 
PLS-00436: implementation restriction: cannot reference fields of BULK In-BIND 
table of records 


SQL> DECLARE
  2    TYPE tab_t IS TABLE OF forall_test_t;
  3    v_tab tab_t;
  4  BEGIN
  5    SELECT forall_test_t(ID, def) BULK COLLECT INTO v_tab FROM forall_test;
  6    FORALL i IN INDICES OF v_tab
  7      UPDATE forall_test
  8        SET def = TREAT(v_tab(i) AS forall_test_t).def
  9        WHERE ID = TREAT(v_tab(i) AS forall_test_t).id;
 10  END;
 11  /

PL/SQL procedure successfully completed.

SQL> SELECT banner FROM v$version;

BANNER                                                                          
----------------------------------------------------------------                
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi                
PL/SQL Release 10.2.0.4.0 - Production                                          
CORE	10.2.0.4.0	Production                                                      
TNS for Linux: Version 10.2.0.4.0 - Production                                  
NLSRTL Version 10.2.0.4.0 - Production                                          

SQL> SPOOL OFF
3 май 11, 10:59    [10597426]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить