IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Oracle Discussion :

Problème dans la procédure MAIN [11g]


Sujet :

Oracle

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2013
    Messages : 18
    Points : 11
    Points
    11
    Par défaut Problème dans la procédure MAIN
    bonjour à tous,
    je suis débutante avec Oracle et j'ai besoin de votre aide.
    je dois réaliser le travail suivant:
    Il y a une liste de fichiers dans la table d'audit dont le NO_EVENT= NULL.
    1- je dois prendre le premier fichier de cette liste
    2- sélectionner l'event_type de ce fichier
    3- mettre a jour la table d'audit en mettant le NO_EVENT de ce fichier a EN COURS (3).
    4- copier le fichier dans la table stg_in_call
    5- mettre a jour la table d'audit en mettant le NO_EVENT de ce fichier a COPIé (4).
    En cas de problème la procedure MAIN passe directement a l'exception et le NO_EVENT prend la valeur ERREUR D'EXECUTION (-9).
    je dois refaire ce travail jusqu’à ce qu'il n'y ai plus aucun fichier dans la table d'audit NO_EVENT= NULL.

    j'ai réussi à faire ça :

    la fonction "GET_FIRST_FILE"qui permet de selectionner le 1er fichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    CREATE OR REPLACE FUNCTION GET_FIRST_FILE RETURN VARCHAR2 IS
     
        var_file     VARCHAR2(100) := NULL;
     
    BEGIN
        SELECT file_name
        INTO var_file
        FROM    (SELECT file_name
                FROM mzaudit.audit_processing_inunified_dwh a
                WHERE   a.pmt_call_status = '4'
                    AND mz_begin >= TRUNC( SYSDATE ) -450
                    AND UPPER( a.file_name ) LIKE 'RUN%'
                    --AND SUBSTR( file_name, 21, 5 ) = event_type
                    AND (stg_no_event IS NULL
                         OR stg_no_event = -9)                
                    AND ROWNUM=1
                ORDER BY SUBSTR( a.file_name, 5, 8 )
                    || SUBSTR( a.file_name, 14, 6 ) );
        return var_file;
        EXCEPTION
            WHEN NO_DATA_FOUND THEN
                NULL;
            WHEN OTHERS THEN
                pmt_log_error ('GET_FIRST_FILE',
                                SQLCODE,
                                SQLERRM,
                                var_file,
                                2,
                                NULL,
                                NULL,
                                'Unknown error');
        end;
    END;
    /
    la procédure "IMPORT_IN_CALL"qui permet de copier le fichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    CREATE OR REPLACE PROCEDURE import_in_call (I_fichier   IN  VARCHAR2,
                                                            I_DATE1     IN  VARCHAR2,
                                                            I_DATE2     IN  VARCHAR2) IS
     
    BEGIN
     
        INSERT INTO stg_in_call (MSISDN, MAIN_BALANCE, PROVIDER_ID, STARTOFCHARGINGDATE, TIMESTAMP,
                                EVENT_TYPE, IS_ROAMING_CALL, CALLED_PARTY, CONVERSATION_DURATION,
                                NORM_CONVERSATION_DURATION, NORM_DESTINATION, CHARGING_ACCOUNT,
                                ACCOUNT1_NAME, ACCOUNT1_CHARGE, ACCOUNT1_NEWBALANCE, ACCOUNT2_NAME,
                                ACCOUNT2_CHARGE, ACCOUNT2_NEWBALANCE, ACCOUNT3_NAME, ACCOUNT3_CHARGE,
                                ACCOUNT3_NEWBALANCE, ACCOUNT4_NAME, ACCOUNT4_CHARGE, ACCOUNT4_NEWBALANCE,
                                ACCOUNT5_NAME, ACCOUNT5_CHARGE, ACCOUNT5_NEWBALANCE, INSERT_DATE,
                                FILE_NAME, OC_TYPE_COM, OC_COUT, OC_SOLDE, ROAMING_FLAG, OC_DESTINATION)
     
            SELECT MSISDN, MAIN_BALANCE, PROVIDER_ID, STARTOFCHARGINGDATE, TIMESTAMP,
                   EVENT_TYPE, IS_ROAMING_CALL, CALLED_PARTY, CONVERSATION_DURATION,
                   NORM_CONVERSATION_DURATION, NORM_DESTINATION, CHARGING_ACCOUNT,
                   ACCOUNT1_NAME, ACCOUNT1_CHARGE, ACCOUNT1_NEWBALANCE, ACCOUNT2_NAME,
                   ACCOUNT2_CHARGE, ACCOUNT2_NEWBALANCE, ACCOUNT3_NAME, ACCOUNT3_CHARGE,
                   ACCOUNT3_NEWBALANCE, ACCOUNT4_NAME, ACCOUNT4_CHARGE, ACCOUNT4_NEWBALANCE,
                   ACCOUNT5_NAME, ACCOUNT5_CHARGE, ACCOUNT5_NEWBALANCE, INSERT_DATE,
                   FILE_NAME, OC_TYPE_COM, OC_COUT, OC_SOLDE, ROAMING_FLAG, OC_DESTINATION
            FROM    pmt.m_in_call
            WHERE   STARTOFCHARGINGDATE IN (I_date1, I_date2)
                    AND file_name = I_fichier
                    AND (ACCOUNT1_NAME IN ('ONNET_ACCOUNT:S_PERIODICBONUS', 'FORFAIT_ACCOUNT:S_PERIODICBONUS', 'ONPEAKACCOUNTID')
                    OR   ACCOUNT2_NAME IN ('ONNET_ACCOUNT:S_PERIODICBONUS', 'FORFAIT_ACCOUNT:S_PERIODICBONUS', 'ONPEAKACCOUNTID')
                    OR   ACCOUNT3_NAME IN ('ONNET_ACCOUNT:S_PERIODICBONUS', 'FORFAIT_ACCOUNT:S_PERIODICBONUS', 'ONPEAKACCOUNTID')
                    OR   ACCOUNT4_NAME IN ('ONNET_ACCOUNT:S_PERIODICBONUS', 'FORFAIT_ACCOUNT:S_PERIODICBONUS', 'ONPEAKACCOUNTID')
                    OR   ACCOUNT5_NAME IN ('ONNET_ACCOUNT:S_PERIODICBONUS', 'FORFAIT_ACCOUNT:S_PERIODICBONUS', 'ONPEAKACCOUNTID'));
     
            exception
                when no_data_found then
                    null;
                when others then
                    pmt_log_error ('IMPORT_IN_CALL',
                                    SQLCODE,
                                    SQLERRM,
                                    I_fichier,
                                    2,
                                    NULL,
                                    NULL,
                                    'Unknown error');
            end;
     
    END;
    /
    La procédure "MAIN"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    CREATE OR REPLACE PROCEDURE STG_IN_MAIN IS
     
        var1 varchar2 (100) := NULL;
        var2 varchar2 (100) := NULL;
        nbr1 number         := NULL;
        dat1 date           := NULL;
        dat2 date           := NULL;
     
    BEGIN    
     
        FOR rec IN (SELECT * 
                    FROM MZAUDIT.AUDIT_PROCESSING_INUNIFIED_DWH) LOOP
     
            var1 := GET_FIRST_FILE;
            DBMS_OUTPUT.PUT_LINE ('Nom de fichier: '||var1);
     
            var2 := SUBSTR( var1, 21, 5);
            DBMS_OUTPUT.PUT_LINE ('Event_type: '||var2);
     
            UPDATE MZAUDIT.AUDIT_PROCESSING_INUNIFIED_DWH
                SET STG_START_CALL= SYSDATE, STG_NO_EVENT= 3
                WHERE file_name = var1;
     
            nbr1 := GET_FILE_DATES (var1, dat1, dat2);
            IMPORT_IN_CALL (var1, dat1, dat2);
     
            UPDATE MZAUDIT.AUDIT_PROCESSING_INUNIFIED_DWH
                SET stg_end_call= sysdate, stg_no_event= 4
                WHERE file_name = var1;
        END LOOP;
     
        EXCEPTION
            WHEN NO_DATA_FOUND THEN
                NULL;
            COMMIT;
            WHEN OTHERS THEN
                UPDATE MZAUDIT.AUDIT_PROCESSING_INUNIFIED_DWH
                    SET stg_no_event= NULL, STG_START_CALL = NULL
                    WHERE file_name = var1;
                pmt_log_error ('STG_IN_MAIN',
                                SQLCODE,
                                SQLERRM,
                                var1,
                                NULL,
                                NULL,
                                var2,
                                'Unknown error');
            COMMIT;
        END;
     
    END;
    /
    Quand j’exécute chaque procédure a part, elle me retourne le résultat attendu
    mais la procédure main affiche le nom du premier fichier de la liste et passe directement a l'exception.
    Je n'ai pas réussi a identifié les erreurs.
    Pouvez vous m'aider s'il vous plais...

  2. #2
    Membre du Club
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Janvier 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2014
    Messages : 28
    Points : 47
    Points
    47
    Par défaut
    Bonjour,

    Pour débugger, il est utile d'avoir une variable valorisée avant chaque action et dont la valeur est remontée dans le bloc d'exception.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    declare
      lEtape                      pls_integer;
    begin
      lEtape := 0;
      -- une action SQL
     
      lEtape := 10;
      -- une autre action SQL
    exception
      when others then
        DBMS_OUTPUT.PUT_LINE( 'lEtape : ' || lEtape );
        raise;
    end;
    La valorisation d'une variable pls_integer est très peu coûteuse par rapport au gain de temps lors de la survenue d'une erreur.

    Pour ton erreur, sans savoir où est vraiment le problème, c'est un peu un jeu de hasard mais le nom du premier fichier est-il assez long pour faire le substr ?

  3. #3
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2013
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Merci alan17,
    Grâce a ta suggestion j'ai pu suivre l’exécution de la procédure et je me suis rendu compte que j'ai declaré dat1 et dat2 varchar2 dans la procédure IMPORT_IN_CALL alors qu'elle sont date dans la procédure MAIN

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème dans une procédure
    Par visvis_id dans le forum PL/SQL
    Réponses: 5
    Dernier message: 23/05/2015, 21h29
  2. problème dans mon procédure
    Par rezguiinfo dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 25/02/2013, 10h55
  3. [Dev-Pascal] Problème dans les procédures de tri
    Par degseb dans le forum Autres IDE
    Réponses: 6
    Dernier message: 19/12/2008, 17h25
  4. problème dans une procédure
    Par winnyzeboss1 dans le forum SQL
    Réponses: 2
    Dernier message: 08/11/2006, 11h00
  5. Problème avec un LIKE dans une procédure stockée
    Par Oluha dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 22/12/2004, 14h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo