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 :

Procédure et exception [10g]


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2012
    Messages : 93
    Par défaut Procédure et exception
    Bonjour,
    j'ai cette requette
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select DEPTNO,count(*) from emp group by DEPTNO;
    qui m'affiche résultat suivant:
    DEPTNO||COUNT(*)
    30||6
    20||5
    10||3

    je veux créer une procédure qui tester si un nombre donner n'est pas existe dans DEPTNO il m'affiche une message(avec exception)
    je fait cette méthode mais toujours affiche non :/

    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
    CREATE OR REPLACE PROCEDURE SUPP(vnocde IN number)
    is
    CURSOR cr IS select DEPTNO,count(*) from emp group by DEPTNO;
    ex exception;
    BEGIN
    FOR i IN cr
    LOOP
    if i.deptno!=vnocde then
    raise ex;
    end if;
    end loop;
    exception
    when ex then
    DBMS_OUTPUT.PUT_LINE('Non');
    end;

  2. #2
    Membre extrêmement actif
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Billets dans le blog
    6
    Par défaut
    Pourquoi aller à une procédure, une simple requête peut faire l'affaire.

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2012
    Messages : 93
    Par défaut
    comment faire avec une requête ?

  4. #4
    Membre extrêmement actif
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Billets dans le blog
    6
    Par défaut
    Tu ajouter ne clause where

  5. #5
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par Aymenkn Voir le message
    ...
    je fait cette méthode mais toujours affiche non :/
    Vous avez un problème de logique dans votre procédure. Imaginez que vous exécutez la procédure en lui passant la valeur 30 et que le curseur vous ramène les enregistrements de votre exemple.
    Dans une boucle vous comparez la valeur transmise 30 avec la valeur courante qui est 30. Les valeurs sont égales donc vous passez à la ligne suivante. Maintenant vous comparez la valeur 30 avec la valeurs 20 et comme les valeurs sont différentes vous sortez la boucle en écrivant NON.
    Autrement dite peut importe la valeur que vous allez fournir à la procédure le résultat sera toujours NON sauf pour le cas où le curseur ramène 1 enregistrement.

    PS. Quand vous comparez des valeurs en PL/SQL n'oubliez pas que parfois, elles peuvent aussi être nulles!

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2012
    Messages : 93
    Par défaut
    merci mnitu pour l'explication, mais je ne sais pas comment résoudre le problème , comment je peut faire la comparaison de tout les valeur de tableau :/

  7. #7
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Pour tester dans une procédure si une valeur existe dans une table j'utilise souvent une requête de ce type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Select Count(*)
       Into l_Cpt
      From Sys.Dual
     Where Exists (Select Null
                     From emp e
                    Where e.deptno = p_deptno
                   )
    A vous d'écrire la procédure maintenant.

  8. #8
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2012
    Messages : 93
    Par défaut
    merci beaucoup
    s'il vous plaît je veux un peu d'explication, pour quoi from Sys.Dual, et pour quoi le résultat de requête 0 ou 1 ?

  9. #9
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    L'accès à la pseudo-table dual est assez optimisez et souvent la colonne testée pour la valeur est indexée. De plus comme dans votre exemple la valeur recherché n'est pas unique. Dans ce cas les autre solutions habituellement employées coûtent finalement plus cher :
    • compter les enregistrements via select count(*) - à quoi bon quand finalement on s'en moque de savoir combien ils sont
    • utiliser un select into et intercepter les exceptions - passer souvent par le bloc d'exception coûte plus cher
    • utiliser un curseur explicite et tester l'attribut found/not found.- plus de code.

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

Discussions similaires

  1. pl/sql procédure avec exception
    Par ines_eleuch dans le forum Débuter
    Réponses: 0
    Dernier message: 24/12/2013, 09h40
  2. SqlTransaction, Procédure, et Exception
    Par Shadam dans le forum VB.NET
    Réponses: 5
    Dernier message: 01/07/2011, 16h00
  3. Procédure stockée Exception ORA-01858
    Par haskouse dans le forum SQL
    Réponses: 3
    Dernier message: 21/02/2011, 12h32
  4. [C#/SQL] Comment gérer les exceptions d'une Procédure stockée ?
    Par thomas_strass dans le forum Accès aux données
    Réponses: 10
    Dernier message: 06/07/2005, 10h40
  5. Réponses: 3
    Dernier message: 09/11/2004, 14h43

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