2014. november 12., szerda

Use FORALL and get pls-00436 restriction

Először is, ez a megszorítás oracle 10g alatt él, 11g és felette már nincs gond. 

Ha 10g alatt akar valaki rekord alapú collekciót használni, nem fog menni.

Nem hiba, hanem feature

SQL> DECLARE
  2     TYPE rec_emp IS RECORD (sal emp.sal%type, empno emp.empno%type);
  3     TYPE emp_aat IS TABLE OF rec_emp
  4        INDEX BY PLS_INTEGER;
  5     aa_emps emp_aat;
  6
  7  BEGIN
  8
  9     FORALL i IN aa_emps.FIRST .. aa_emps.LAST
 10        UPDATE emp
 11        SET    sal = aa_emps(i).sal * 1.1
 12        WHERE  empno = aa_emps(i).empno;
 13
 14  END;
 15  /

Errors: check compiler log
PLS-00436: implementation restriction: cannot reference fields of BULK In-BIND table of records


Workaround

Megoldás: mivel nekem csak két mezőből állt a rekordom, így egyszerű volt külön kollekcióként felvenni őket. Több mező esetén már más megoldás kell. Pl.: db upgrade :) vagy át kell írni FOR .. LOOP megoldásra.

SQL> DECLARE
  2     TYPE t_sal IS TABLE OF emp.sal%type;
  3        INDEX BY PLS_INTEGER;
  4     TYPE t_empno IS TABLE OF emp.empno%type
  5        INDEX BY PLS_INTEGER; 
  6   
  7     lv_sal t_sal;
  8     lv_empno t_empno;
  9
 10  BEGIN
 11
 12     FORALL i IN lv_sal.FIRST .. lv_sal.LAST
 13        UPDATE emp
 14        SET    sal = lv_sal(i) * 1.1
 15        WHERE  empno = lv_empno(i);
 16
 17  END;
 18  /


Nincsenek megjegyzések:

Megjegyzés küldése