Bereits seit Version 9.2 ist es prinzipiell zulässig, Collections für Bulk DML zu verwenden, die als Datentyp einen Record haben. Sinnvolle Einsatzmöglichkeiten dafür gab es aber nur beim INSERT-Befehl, da der Record nur als Ganzes angesprochen werden durfte, aber nicht einzelne Felder daraus. Das bedeutete: Wollte man aus Performance-Gründen mit Bulk Update oder Delete arbeiten, musste man (auch in 10g) für jede einzelne Spalte eine eigene Collection befüllen.
Diese Beschränkung ist mit Version 11g nun endlich gefallen! Record-Arrays sind in beliebiger Anwendung in Bulk DML zulässig, und der Record braucht auch nicht mehr der Struktur der Tabelle zu entsprechen.
Beispiel:
DECLARE
TYPE t_emp IS TABLE OF emp%ROWTYPE
INDEX BY PLS_INTEGER;
TYPE rt_emp IS RECORD (
empno emp.empno%TYPE,
ename emp.ename%TYPE,
sal emp.sal%TYPE
);
TYPE rtt_emp IS TABLE OF rt_emp
INDEX BY PLS_INTEGER;
v_emp_row t_emp;
v_emp_record rtt_emp;
BEGIN
SELECT *
BULK COLLECT INTO v_emp_row
FROM emp;
FORALL i IN INDICES OF v_emp_row
UPDATE emp
SET sal = v_emp_row (i).sal * 1.1
WHERE empno = v_emp_row (i).empno;
SELECT empno, ename, sal
BULK COLLECT INTO v_emp_record
FROM emp
WHERE job = 'ANALYST';
FORALL i IN INDICES OF v_emp_record
DELETE FROM emp
WHERE empno = v_emp_record (i).empno;
FORALL i IN INDICES OF v_emp_record
INSERT INTO emp (empno, ename )
VALUES (v_emp_record (i).empno, v_emp_record (i).ename );
END;
/
Anmerkung
Die Syntax-Variante IN INDICES OF wurde mit Version 10g eingeführt und ermöglicht es, Collections mit Lücken zu verarbeiten. Weitere Einzelheiten finden Sie hier.
Weitere Informationen zu diesem Thema bekommen Sie in unserer 11g New Feature-Schulung.
Bitte nehmen Sie mich in den Verteiler der monatlichen Tipps & Tricks auf.