Conforme falado no Post anterior, o desempenho da codificação do FORALL é extremamente rápido.
Precisei migrar uma tabela com alguns milhões de registros, assim foi necessário efetuar um INSERT parcial.
No exemplo, a cada 500 Mil de INSERTS será feito um commit:
DECLARE C_limit PLS_INTEGER := 500000; TYPE TCOLUNA1 IS TABLE OF TABELA.COLUNA1%TYPE; TYPE TCOLUNA2 IS TABLE OF TABELA.COLUNA2%TYPE; TYPE TCOLUNA3 IS TABLE OF TABELA.COLUNA3%TYPE; TYPE TCOLUNA4 IS TABLE OF TABELA.COLUNA4%TYPE; TYPE TCOLUNA5 IS TABLE OF TABELA.COLUNA5%TYPE; TYPE TCOLUNA6 IS TABLE OF TABELA.COLUNA6%TYPE; TYPE TCOLUNA7 IS TABLE OF TABELA.COLUNA7%TYPE; TYPE TCOLUNA8 IS TABLE OF TABELA.COLUNA8%TYPE; TYPE TCOLUNA9 IS TABLE OF TABELA.COLUNA9%TYPE; V_COLUNA1 TCOLUNA1; V_COLUNA2 TCOLUNA2; V_COLUNA3 TCOLUNA3; V_COLUNA4 TCOLUNA4; V_COLUNA5 TCOLUNA5; V_COLUNA6 TCOLUNA6; V_COLUNA7 TCOLUNA7; V_COLUNA8 TCOLUNA8; V_COLUNA9 TCOLUNA9; CURSOR CUR IS SELECT COLUNA1,COLUNA2,COLUNA3,COLUNA4,COLUNA5,COLUNA6,COLUNA7,COLUNA8,COLUNA9 FROM TABELA; BEGIN OPEN CUR; LOOP FETCH CUR BULK COLLECT INTO V_COLUNA1,V_COLUNA2,V_COLUNA3,V_COLUNA4,V_COLUNA5,V_COLUNA6,V_COLUNA7,V_COLUNA8,V_COLUNA9 LIMIT c_limit; FORALL i in 1..V_COLUNA1.count INSERT INTO NOVA_TABELA (COLUNA1,COLUNA2,COLUNA3,COLUNA4,COLUNA5,COLUNA6,COLUNA7,COLUNA8,COLUNA9) VALUES (V_COLUNA1(i),V_COLUNA2(i),V_COLUNA3(i),V_COLUNA4(i),V_COLUNA5(i),V_COLUNA6(i),V_COLUNA7(i),V_COLUNA8(i),V_COLUNA9(i)); EXIT WHEN V_COLUNA1.COUNT = 0; DBMS_OUTPUT.PUT_LINE(TO_CHAR(SQL%ROWCOUNT) || ' Linhas INSERIDAS'); COMMIT; END LOOP; CLOSE CUR; END;
Valeu,
Bruno Duarte.
Bruno Duarte.
Boa tarde... tem um mesmo exemplo em SQL-Server?
ResponderExcluir