2017-08-21 1 views
0

Je veux que dans une seule transaction en vouloir supprimer et insérer mais si aucune ligne supprimer alors il devrait augmenter et erreur d'autre insertion (instruction Multiple insert et supprimer). Cette déclaration supprime les données mais ne les insère pas. Ce que j'ai essayé:Supprimer et insérer ne fonctionne pas dans un bloc dans Oracle

J'ai enlevé l'erreur de relance aussi, alors ce supprime mais pas l'insertion des dossiers,

Si j'écrire la déclaration de suppression en bas, alors il est insérait mais pas la suppression.

Si aucune ligne n'est supprimée, je dois déclencher une erreur pour un bloc. Sinon, il devrait fonctionner comme l'instruction donnée. c'est un exemple qu'il contient, 500 (autour) insérer ou supprimer un script dans une transaction. Transaction Transmet également une erreur si la transaction a échoué.

BEGIN 
    DBMS_OUTPUT.put_line (1); 

    BEGIN 
     DBMS_OUTPUT.put_line (1); 

     DELETE FROM CMC_BSDL_DETAILS 
      WHERE PDBC_PFX = 'CW6F'; 

     COMMIT; 

     IF SQL%ROWCOUNT = 0 
     THEN 
     RAISE_APPLICATION_ERROR (-20101, 'No 
    record deleted'); 
     END IF; 


     DELETE FROM CMC_BSTX_SUM_TEXT 
      WHERE PDBC_PFX = 'CW6F'; 

     COMMIT; 

     IF SQL%ROWCOUNT = 0 
     THEN 
     RAISE_APPLICATION_ERROR (-20101, 'No 
     record deleted'); 
     END IF; 


     INSERT INTO CMC_BSDL_DETAILS (PDBC_PFX, 
            BSDL_TYPE, 
            BSDL_NTWK_IND, 
            BSDL_EFF_DT, 
            BSDL_COPAY_AMT, 
            BSDL_DEDE_AMT, 
            BSDL_COIN_PCT, 
            BSDL_LTLT_AMT, 
            BSDL_TERM_DT, 
            BSDL_LT_TYPE, 
            BSDL_LT_PERIOD, 
            BSDL_LT_COUNTER, 
            BSDL_TIER, 
            BSDL_COV_IND, 
            BSDL_STOPLOSS_AMT, 
            BSDL_STOPLOSS_TYPE, 
            BSDL_BEG_MMDD, 
            BSDL_USER_LABEL1, 
            BSDL_USER_DATA1, 
            BSDL_USER_LABEL2, 
            BSDL_USER_DATA2, 
            BSDL_USER_LABEL3, 
            BSDL_USER_DATA3, 
            BSDL_USER_LABEL4, 
            BSDL_USER_DATA4, 
            BSDL_USER_LABEL5, 
            BSDL_USER_DATA5, 
            BSDL_USER_LABEL6, 
            BSDL_USER_DATA6, 
            BSDL_LOCK_TOKEN, 
            ATXR_SOURCE_ID, 
            SYS_LAST_UPD_DTM, 
            SYS_USUS_ID, 
            SYS_DBUSER_ID) 
      VALUES (
        'CW6F', 
        'AAMB', 
        'A', 
        TO_TIMESTAMP ('01/01/1990 
      00:00:00', 
            'MM/DD/YYYY 
      HH24:MI:SS.FF'), 
        250.00, 
        0.00, 
        0.00, 
        0.00, 
        TO_TIMESTAMP ('12/31/9999 
      00:00:00', 
            'MM/DD/YYYY HH24:MI:SS.FF'), 
        ' ', 
        ' ', 
        ' ', 
        0, 
        ' ', 
        0.00, 
        ' 
      ', 
        0, 
        ' ', 
        ' ', 
        ' ', 
        ' ', 
        ' ', 
        ' ', 
        ' ', 
        ' ', 
        ' ', 
        ' ', 
        ' ', 
        ' 
       ', 
        1, 
        TO_TIMESTAMP ('01/01/1753 00:00:00', 
            'MM/DD/YYYY 
     HH24:MI:SS.FF'), 
        TO_TIMESTAMP ('08/17/2017 16:15:10', 
            'MM/DD/YYYY 
       HH24:MI:SS.FF'), 
        'Translator', 
        'Translator'); 

     COMMIT; 
    END; 
EXCEPTION 
    WHEN OTHERS 
    THEN 
     ROLLBACK; 
END; 
+0

Il serait très utile si vous montrez les commandes réelles que vous avez essayé – Aemyl

+0

J'ai ajouté le code, Pouvez-vous s'il vous plaît vérifier – Ashu

+0

Pourquoi attrapez-vous toutes les exceptions que vous lancez avec «when others» ?? Soit l'enlever complètement, soit au moins ajouter une «relance» à l'intérieur. –

Répondre

1

Effectuer une vérification avant une déclaration COMMIT, immédiatement après la DELETE.
il suffit de déplacer le COMMIT après la déclaration IF ... END IF:

DELETE FROM CMC_BSDL_DETAILS 
     WHERE PDBC_PFX = 'CW6F'; 

    IF SQL%ROWCOUNT = 0 
    THEN 
    RAISE_APPLICATION_ERROR (-20101, 'No record deleted'); 
    END IF; 

    COMMIT; 

DELETE FROM CMC_BSTX_SUM_TEXT 
     WHERE PDBC_PFX = 'CW6F'; 

    IF SQL%ROWCOUNT = 0 
    THEN 
    RAISE_APPLICATION_ERROR (-20101, 'No 
    record deleted'); 
    END IF; 

    COMMIT; 

BTW - si vous voulez faire toutes ces déclarations dans une seule transaction, alors ne commettent pas entre ces déclarations du tout. Exécuter un seul COMMIT à la fin. Chaque déclaration de validation termine une transaction, en fait il y a 3 déclarations de validation et 3 transactions dans votre procédure, pas une.