2016-09-02 3 views
0

J'essaie d'insérer des données dans une table de sauvegarde avec l'aide de rowtype comme ci-dessousobtenir l'erreur ORA-01400: ne peut pas insérer NULL ... tout en insérant des données avec l'aide de rowtype

declare 
     vl_bkp_rec schema.table1%ROWTYPE; 
     BEGIN 
     FOR cur_rec IN 
       (SELECT  * 
       FROM schema.table1 
       WHERE column_1  ='3f1d6348-014e-1000-8461-700c000493e0' 
       AND primary_key_column NOT IN ('8dc81f6e-0156-1000-8291-700e000493e0') 
      ) 
       LOOP 
       INSERT INTO schema.backup_table VALUES vl_bkp_rec; 
     END LOOP; 
COMMIT; 
     EXCEPTION 
     WHEN OTHERS THEN 
      lv_err_msg := SUBSTR(SQLERRM, 1, 2999); 
      DBMS_OUTPUT.PUT_LINE('Handled - error while executing script. =>'|| lv_err_msg); 
      ROLLBACK; 
     END; 
     /

je reçois ci-dessous erreur

Handled - error while executing script. =>ORA-01400: cannot insert NULL into ("schema"."backup_table"."primary_key_column") 

mais table1 et backup_table ont exactement la même structure. (Créé backup_table comme ci-dessous)

CREATE TABLE schema.backup_table AS 
    (SELECT * FROM schema.table1 WHERE rownum <1 
); 

et requête de sélection utilisé ci-dessus va chercher des données valides. Qu'est-ce que je fais mal ici?

+3

Vous avez sélectionné les données dans la variable curseur cur_rec. La variable vl_bkp_rec n'est pas utilisée et est NULL; – Mike

+2

Pourquoi ne pas utiliser 'insert dans la table backup_table select * from table1 où ...' – Mike

Répondre

1

Vous devez utiliser votre variable de la manière ci-dessous. Actuellement, dans votre code, la variable déclarée en tant que type de table n'est pas remplie: voir ci-dessous comment l'utiliser.

declare 
    vl_bkp_rec table1%ROWTYPE; 
    BEGIN 
     FOR cur_rec IN 
        (SELECT  * 
        FROM table1    
       ) 
     LOOP         
      vl_bkp_rec:=cur_rec; --Assign values of the cursor variable to your variable 

      INSERT INTO backup_table VALUES vl_bkp_rec; 

     END LOOP; 
    COMMIT; 
     EXCEPTION 
     WHEN OTHERS THEN 
     --lv_err_msg := SUBSTR(SQLERRM, 1, 2999); ---you need to decalre it befor using it 
     DBMS_OUTPUT.PUT_LINE('Handled - error while executing script. =>'); 
     ROLLBACK; 
     END; 
    /
+0

merci! ça a marché. et à propos de la variable lv_err_msg, je l'ai déclaré dans mon script, j'ai oublié de le coller ici. :) – Onkar