Bulk DML mit Record-Arrays in 11g

04.
Februar
2008
Veröffentlicht von: Hildegard Asenbauer

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.

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-Opens internal link in current windowSchulung.

PL/SQL

Jede Menge Know-how für Sie!

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.