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

PL/SQL Oracle Discussion :

Vérification de l'exécution d'une procédure


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Inscrit en
    Mai 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 33
    Par défaut Vérification de l'exécution d'une procédure
    Bonjour,
    Je voudrai savoir quelle commande utiliser pour vérifier si une procédure delete, insert ou update a bien été effectué pour que mon programme ne supprime pas l'enregistrement de la table source si un problème est survenu (table bloqué ...)

  2. #2
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    Dans quel langage? Script? SQL*PLus? PL/SQL ?

    dans sqlplus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHENEVER SQLERROR EXIT FAILURE ROLLBACK
    p.ex.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SQL> create table t(x number primary key);
    Table created.
    SQL> WHENEVER SQLERROR EXIT FAILURE ROLLBACK
    SQL> insert into t(x) values (1);
    1 row created.
    SQL> insert into t(x) values (1);
    insert into t(x) values (1)
    *
    ERROR at line 1:
    ORA-00001: unique constraint (SCOTT.SYS_C0029695) violated
     
    Disconnected from ...
    Dans PL/SQL, gère les exceptions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    begin
      insert into t(x) values (1);
      insert into t(x) values (1);
    end;
    /
     
    begin
    *
    ERROR at line 1:
    ORA-00001: unique constraint (SCOTT.SYS_C0029695) violated
    ORA-06512: at line 3

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Par défaut
    bonjour,

    Tu peux utiliser en pl/sql la gestion d'exceptions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Exception when others then

  4. #4
    Membre averti
    Femme Profil pro
    Inscrit en
    Mai 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 33
    Par défaut
    C'est vrai que je ne l'ai pas précisé c'est en pl sql.
    Est-il possible de passer cette instruction à l'intérieur d'une boucle?
    IL faudrai que j'arrive à sa:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    WHILE condition LOOP
    ....
    COMMIT;
    appel de procedure delete, update ou insert
    IF delete, update ou insert ne c est pas effectuer THEN
    ROLLBACK;
    END IF;
    ...
    END LOOP;
    J'ai essayé ceci en dehors de ma boucle sa fonctionne mais pas a l'intérieur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        EXCEPTION
        WHEN OTHERS THEN
        raise_application_error (20000, 'Modification non pris en compte');
        ROLLBACK;
    quel qu'un a une idéé de comment je pourai faire?

  5. #5
    Membre averti
    Femme Profil pro
    Inscrit en
    Mai 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 33
    Par défaut
    Ça marche en utilisant ce code dans chaque procédure.

  6. #6
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    tu peux avoir des begin dans les begin...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    BEGIN
    ...
      LOOP
        ...
        BEGIN
           INSERT
        EXCEPTION
          WHEN ... 
        END;
       ...
      END LOOP;
      ...
    END;

  7. #7
    Membre Expert

    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    536
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 536
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    WHILE condition LOOP
    ....
    COMMIT;
    appel de procedure delete, update ou insert
    IF delete, update ou insert ne c est pas effectuer THEN
    ROLLBACK;
    END IF;
    ...
    END LOOP;
    Bonjour,

    Vous faites un COMMIT à l'interieur de la LOOP (commit accross FETCH) ce qui n'est pas du tout conseillé pour plusieurs raisons entre autres les suivantes:
    (1) parce que c'est une des raisons qui provoque l'erreur ORA-01555 rollback segment snapshot too old
    (2) en cas d'erreur survenue dans la nième itération vous auriez alors un traitement à moitié fait et vous allez avoir des problèmes à redémarrer correctement votre programme.

    Vous devriez plutôt utiliser ceci

    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
     
    LOOP
     
         BEGIN
            -- set a savepoint so that in case of error will rollback       
            SAVEPOINT sav_point;
            /* your pl/sql code goes here */
     
         EXCEPTION
            WHEN OTHERS THEN
            ROLLBACK to sav_point;
            -- ici il faut prévoir quelque chose pour stocker
            -- l'erreur dans une table afin de savoir quel record
            -- est en erreur et pourquoi
          END;
       -- next message
     END LOOP;
     
     COMMIT;
    END;
    Evidement que le code ci-dessus n'est pas encore complet car il faudrait que le select qui conduit la loop ne considère que les records qui n'ont pas été traités. Ainsi vous auriez un code re-demarable

    Bien à vous

    Mohamed Houri

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

Discussions similaires

  1. Exécution d'une procédure stockée dans Sql
    Par Pascalp dans le forum Access
    Réponses: 4
    Dernier message: 01/09/2006, 11h47
  2. [MySQL 5.1]Exécution d'une procédure au démarrage du serveur.
    Par Alexandre T dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 16/06/2006, 14h54
  3. Accès non autorisé à l'exécution d'une procédure stockée
    Par celine33 dans le forum Bases de données
    Réponses: 6
    Dernier message: 11/01/2006, 10h27
  4. [VB6] Durée d'exécution d'une procédure
    Par Peltchag dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 17/10/2005, 14h51
  5. Réponses: 15
    Dernier message: 08/07/2004, 08h20

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