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