Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Обращение к массиву после bulk collect into  [new]
кактотак
Guest
Подскажите, почему не получается выполнить такой ход:

create table t ( col number(2));
 
 
insert into t values (1);
commit;
insert into t values (2);
commit;

declare
    type array is table of t%rowtype;
    a_data array;
    cursor c is  
    select * from t;
    type idxtbl is table of number(2) index by pls_integer;
    tbl idxtbl;
begin
    tbl(1):=1;
    tbl(2):=2;
            open c;
            loop    
            fetch c bulk collect into a_data limit 100;
            forall i in 1..a_data.count
                        update  t
                        set  col=tbl(a_data(i).col)
                        --set col=tbl(col)
                        where  col=a_data(i).col;
            commit;
            exit when c%notfound;
            end loop;
            close c;
end;

ORA-06550: Строка 14, столбец 25:
PLS-00801: внутр.ошибка [*** ASSERT at file pdw4.c, line 3579; Can't handle Object = -2147483518 in D_S_ED -2147483519.; Xanon__0x3626bc158__AB[14, 25]]'

Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
18 июл 14, 18:02    [16326754]     Ответить | Цитировать Сообщить модератору
 Re: Обращение к массиву после bulk collect into  [new]
Elic
Member

Откуда:
Сообщений: 29979
кактотак
forall i ... = tbl(a_data(i).col)
18 июл 14, 18:27    [16326907]     Ответить | Цитировать Сообщить модератору
 Re: Обращение к массиву после bulk collect into  [new]
кактотак
Guest
Elic,

Не смог раскусить, можно еще хинт?
21 июл 14, 09:57    [16333377]     Ответить | Цитировать Сообщить модератору
 Re: Обращение к массиву после bulk collect into  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
кактотак,

Дока формулирует витиевато:
http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/forall_statement.htm
Performance benefits apply only to collection references that use index as an index.

SQL> declare
  2    type array is table of number;
  3    a_data array;
  4    tbl    sys.odcinumberlist := sys.odcinumberlist(1);
  5  begin
  6    select rownum bulk collect into a_data from dual;
  7    forall i in 1 .. 1
  8      update t set col = tbl(a_data(i));
  9  end;
 10  /
    update t set col = tbl(a_data(i));
                           *
ERROR at line 8:
ORA-06550: line 8, column 28:
PLS-00431: bulk SQL attributes must use a single index
ORA-06550: line 8, column 24:
PL/SQL: ORA-00904: : invalid identifier
ORA-06550: line 8, column 5:
PL/SQL: SQL Statement ignored


SQL>
SQL> declare
  2    type array is table of t%rowtype;
  3    a_data array;
  4    tbl    sys.odcinumberlist := sys.odcinumberlist(1);
  5  begin
  6    select rownum bulk collect into a_data from dual;
  7    forall i in 1 .. 1
  8      update t set col = tbl(a_data(i).col);
  9  end;
 10  /
  forall i in 1 .. 1
              *
ERROR at line 7:
ORA-06550: line 7, column 15:
PLS-00801: internal error [*** ASSERT at file pdw4.c, line 3571; Can't handle
Object = -2147483583 in D_S_ED -2147483584.; Xanon__AEFA7024__AB[7, 15]]

Во втором случае видать просто не обработали нормально, чтоб выдало PLS-00431.
28 июл 14, 05:57    [16364266]     Ответить | Цитировать Сообщить модератору
 Re: Обращение к массиву после bulk collect into  [new]
-2-
Member

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

Попробуй сделать коллекцию of pls_integer и использовать forall values.
28 июл 14, 09:58    [16364600]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить