Skip to Main Content

SQL & PL/SQL

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

DUP_VAL_ON_INDEX EXCEPTION in stored procedure

R. RoyalJan 21 2010 — edited Jan 21 2010
Hi,
below my stored procedure:
CREATE OR REPLACE PROCEDURE MY_PROC IS
ERR_NUM                          NUMBER;
ERR_MSG                          VARCHAR2(300);
V_COUNT                          NUMBER;
V_EM_ID                          VARCHAR2(64);
V_EM_NUMBER                      VARCHAR2(64);
V_NAME_FIRST                     VARCHAR2(64);
V_EMAIL                          VARCHAR2(64);
V_CELLULAR_NUMBER                VARCHAR2(64);
V_STATUS                         VARCHAR2(64);
V_HONORIFIC                      VARCHAR2(64);
V_EMSTD                          VARCHAR2(64);
V_DP_ID                          VARCHAR2(64);
V_PCT_RM                         NUMBER;
V_DATA_CESSAZIONE                DATE;
 
 
      CURSOR A IS
      SELECT A.MATRICOLA, A.CID_RIFERIMENTO, A.NOME, A.COGNOME, A.MAILBOX, A.DESC_QUALIFICA,
      A.STATO, A.SESSO, DECODE (TRIM(A.DESC_QUALIFICA), 'Dirigente','DIR','Consulente',
                                      'CONSUL','Quadro','QUADRO','Operaio','OPERAIO',
                                'Impiegato', DECODE(TRIM(A.LIVELLO),'4','IMP_QUARTO',
                                '5','IMP_QUINTO','6','IMP_SESTO','7','IMP_SETTIMO','IMP_NOLIVELLO' ),'NA') QUALIFICA_LIVELLO,
      A.CODICE, A.PCTPARTTIME, A.DATA_CESSAZIONE
      FROM WA_TO_AFM A
      WHERE STATO='1';
 
BEGIN
      FOR CUR_A IN A
    LOOP
        BEGIN
 
               IF  CUR_A.CID_RIFERIMENTO  IS NULL     THEN
 
                       SELECT COUNT(*)
                       INTO V_COUNT
                       FROM EM_BK B
                       WHERE B.EM_NUMBER=CUR_A.MATRICOLA;
 
                       IF V_COUNT = 0 THEN
 
                                    INSERT INTO EM_BK (EM_ID, EM_NUMBER, NAME_FIRST,NAME_LAST, EMAIL ,STATUS, HONORIFIC, CONTINGENCY_EMAIL, DP_ID, PCT_RM, EM_STD, W_DATA_CESSAZIONE)
                                    VALUES (CUR_A.COGNOME||'_'||SUBSTR(CUR_A.NOME,1,3)||SUBSTR(CUR_A.MATRICOLA,-2),
                                    CUR_A.MATRICOLA, CUR_A.NOME,CUR_A.COGNOME, CUR_A.MAILBOX, CUR_A.STATO, CUR_A.SESSO, CUR_A.QUALIFICA_LIVELLO,
                                    CUR_A.CODICE, NVL(CUR_A.PCTPARTTIME,1), DECODE (TRIM(CUR_A.DESC_QUALIFICA), 'Dirigente','DIR',
                                                       'Consulente','CONSUL',
                                                       'Quadro','FUNZ',
                                                       'Operaio','IMP',
                                                       'Impiegato','IMP'), CUR_A.DATA_CESSAZIONE);
                       
                       -- here I'd like to handle EXCEPTION  DUP_VAL_ON_INDEX FOR CUR_A.CID_RIFERIMENTO  IS NULL

                       
                       END IF;
               ELSE     -- CUR_A.CID_RIFERIMENTO IS NOT NULL

                               SELECT COUNT(*)
                               INTO V_COUNT
                               FROM EM_BK
                               WHERE EM_NUMBER=CUR_A.MATRICOLA;
 
                               IF V_COUNT=0 THEN 
                               
                               
                               SELECT EM_ID,EMAIL,STATUS, HONORIFIC,CONTINGENCY_EMAIL, DP_ID, PCT_RM, W_DATA_CESSAZIONE
                                      INTO V_EM_ID,V_EMAIL,V_STATUS, V_HONORIFIC,V_EMSTD, V_DP_ID, V_PCT_RM, V_DATA_CESSAZIONE
                                      FROM EM_BK
                                      WHERE EM_NUMBER=CUR_A.CID_RIFERIMENTO;
                               
                               
                               INSERT INTO EM_BK (EM_ID, EM_NUMBER, NAME_FIRST,NAME_LAST, EMAIL ,STATUS, HONORIFIC,CONTINGENCY_EMAIL, DP_ID, PCT_RM, EM_STD, W_DATA_CESSAZIONE,W_FLAG_CID_RIFERIMENTO)
                                            VALUES (CUR_A.COGNOME||'_'||SUBSTR(CUR_A.NOME,1,3)||SUBSTR(CUR_A.MATRICOLA,-2),
                                            CUR_A.MATRICOLA, CUR_A.NOME,CUR_A.COGNOME, V_EMAIL, V_STATUS,V_HONORIFIC,V_EMSTD, V_DP_ID, V_PCT_RM,
                                            DECODE (TRIM(CUR_A.DESC_QUALIFICA), 'Dirigente','DIR',
                                                       'Consulente','CONSUL',
                                                       'Quadro','FUNZ',
                                                       'Operaio','IMP',
                                                       'Impiegato','IMP'), V_DATA_CESSAZIONE, 'Y');
 

                               END IF;
 
               END IF;
               
               -- here I'd like to handle EXCEPTION  DUP_VAL_ON_INDEX FOR CUR_A.CID_RIFERIMENTO  IS NOT NULL
 
                  EXCEPTION
          
                  WHEN DUP_VAL_ON_INDEX  THEN
                        INSERT INTO EM_BK (EM_ID, EM_NUMBER, NAME_FIRST,NAME_LAST, EMAIL ,STATUS, HONORIFIC,CONTINGENCY_EMAIL, DP_ID, PCT_RM, EM_STD, W_DATA_CESSAZIONE, W_FLAG_CID_RIFERIMENTO)
                                            VALUES (CUR_A.COGNOME||'_'||SUBSTR(CUR_A.NOME,1,3)||SUBSTR(CUR_A.MATRICOLA,-2)||'_'||SUBSTR ('00000' || SEQ_EM_ID.NEXTVAL, -5),
                                            CUR_A.MATRICOLA, CUR_A.NOME,CUR_A.COGNOME, V_EMAIL, V_STATUS,V_HONORIFIC,V_EMSTD, V_DP_ID, V_PCT_RM,
                                            DECODE (TRIM(CUR_A.DESC_QUALIFICA), 'Dirigente','DIR',
                                                       'Consulente','CONSUL',
                                                       'Quadro','FUNZ',
                                                       'Operaio','IMP',
                                                       'Impiegato','IMP'), V_DATA_CESSAZIONE, 'Y');
         END;
    END LOOP;
            COMMIT;
 
END;
I handle EXCEPTION DUP_VAL_ON_INDEX ONLY FOR CUR_A.CID_RIFERIMENTO IS NOT NULL

I'd like to handle EXCEPTION DUP_VAL_ON_INDEX ALSO FOR CUR_A.CID_RIFERIMENTO IS NULL

How can I modify my stored procedure (begin...end...innested)?

Thanks in advance!
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Feb 18 2010
Added on Jan 21 2010
8 comments
4,560 views