2017-10-20 18 views
1

J'utilise des curseurs pour insérer des données dans une table car si un enregistrement échoue, je veux seulement que cet enregistrement soit ignoré et continue d'insérer le reste. Donc, j'utilise un curseur pour récupérer l'information.PL/SQL- Comment insérer dans une table en utilisant toutes les colonnes d'un curseur

Est-il possible d'insérer toutes les colonnes d'un curseur à la fois et de ne pas les sélectionner une par une?

cursor c1 is 
select a,b,c,d,e from ab where a = 'something'; 

begin 
for var_c1 in c1 loop 
begin 

insert into ba (a,b,c,d,e) 
values (var_c1.all); 

-- instead of values (var_c1.a, var_c1.b, var_c1.c,var_c1.d, var_c1.e) 
exception when others then continue; 
end; 

end; 
+0

Je vous suggère de faire de la lecture et cela vous aiderait certainement à résoudre votre problème. Lisez ceci http://www.oracle.com/technetwork/issue-archive/2012/12-sep/o52plsql-1709862.html – XING

Répondre

1

Pour des performances, vous devez mettre tous vos enregistrements dans une collection, vous pouvez utiliser BULK INSERT... SAVE EXCEPTION comme ci-dessous:

DECLARE 
    TYPE t_tab IS TABLE OF ba%ROWTYPE; 

    l_tab   t_tab := t_tab(); 
    l_error_count NUMBER; 

    ex_dml_errors EXCEPTION; 
    PRAGMA EXCEPTION_INIT(ex_dml_errors, -24381); 
BEGIN 
    -- Fill the collection. *** 
    -- l_tab <--- ?? 
    -- *** next question is to make l_tab fill with the result of your cursor  
    -- 
    -- Perform a bulk operation. 
    BEGIN 
    FORALL i IN l_tab.first .. l_tab.last SAVE EXCEPTIONS 
     INSERT INTO ba 
     VALUES l_tab(i); 
    EXCEPTION 
    WHEN ex_dml_errors THEN 
     l_error_count := SQL%BULK_EXCEPTIONS.count; 
     DBMS_OUTPUT.put_line('Number of failures: ' || l_error_count); 
     FOR i IN 1 .. l_error_count LOOP 
     DBMS_OUTPUT.put_line('Error: ' || i || 
      ' Array Index: ' || SQL%BULK_EXCEPTIONS(i).error_index || 
      ' Message: ' || SQLERRM(-SQL%BULK_EXCEPTIONS(i).ERROR_CODE)); 
     END LOOP; 
    END; 
END; 
/

Hope it helps