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 Informationen zu diesem Thema bekommen Sie in unserer 11g New Feature-Schulung.
In unserer Know-How Datenbank finden Sie mehr als 300 ausführliche Beiträge zu den
Oracle-Themen wie DBA, SQL, PL/SQL, APEX und vielem mehr.
Hier erhalten Sie Antworten auf Ihre Fragen.