La regola generale è, se è possibile farlo utilizzando una singola istruzione SQL invece di utilizzare PL/SQL, è necessario. Di solito sarà più efficiente.
Tuttavia, se è necessario aggiungere più logica procedurale (per qualche motivo), potrebbe essere necessario utilizzare PL/SQL, ma è necessario utilizzare le operazioni di massa anziché l'elaborazione riga per riga. (Nota: in Oracle 10g e versioni successive, il ciclo FOR utilizzerà automaticamente BULK COLLECT per recuperare 100 righe alla volta, tuttavia l'istruzione di inserimento verrà comunque eseguita riga per riga).
ad es.
DECLARE
TYPE tA IS TABLE OF FOO.A%TYPE INDEX BY PLS_INTEGER;
TYPE tB IS TABLE OF FOO.B%TYPE INDEX BY PLS_INTEGER;
TYPE tC IS TABLE OF FOO.C%TYPE INDEX BY PLS_INTEGER;
rA tA;
rB tB;
rC tC;
BEGIN
SELECT * BULK COLLECT INTO rA, rB, rC FROM FOO;
-- (do some procedural logic on the data?)
FORALL i IN rA.FIRST..rA.LAST
INSERT INTO BAR(A,
B,
C)
VALUES(rA(i),
rB(i),
rC(i));
END;
L'ha sopra il vantaggio di minimizzare contesto commuta tra SQL e PL/SQL. Oracle 11g offre inoltre un supporto migliore per le tabelle di record, in modo da non dover disporre di una tabella PL/SQL separata per ogni colonna.
Inoltre, se il volume dei dati è molto elevato, è possibile modificare il codice per elaborare i dati in lotti.
fonte
2009-06-15 04:41:26
FYI, non si dovrebbe fare riferimento a questo come un "inserto di massa". Mentre potresti inserire grandi quantità di dati, c'è una funzione PL/SQL chiamata Bulk Operations (Bulk Inserts, Bulk Collect) ecc. – moleboy
E per aggiungere al riferimento alle operazioni bulk, dovresti considerare che al di sopra degli altri due per le operazioni con i dati di grandi dimensioni o in corso, operazioni di inserimento regolari. Gli inserti di massa possono produrre enormi miglioramenti delle prestazioni rispetto ai semplici inserti negli esempi forniti. – DCookie