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 :

Problemes dans une procédure


Sujet :

PL/SQL Oracle

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2019
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1
    Points : 4
    Points
    4
    Par défaut Problemes dans une procédure
    Bonsoir ma procédure compile mais ne produit rien comme résultat.

    Il s'afit de creer une procédure qui ouvre un compte bancaire : OuvrirCompte(NumCli in number, Montant in number) Cette procédure crée un nouveau compte pour un client (NumCli) avec un premier solde (Montant) : -NumCompte est attribué automatiquement par une séquence ; -DateOuverture est la date système ; -Montant > 0 ; -PMVR est initialisée à 0 ; -Si le client n’existe pas, il y a erreur.


    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
    CREATE OR REPLACE PROCEDURE OuvrirCompte(NumCli IN NUMBER, Montant in NUMBER)
    IS
       	client_inexistant  EXCEPTION;
       PRAGMA EXCEPTION_INIT (	client_inexistant, -2291);
    BEGIN
       IF (Montant < 0)
       THEN
          RAISE_APPLICATION_ERROR (-20002, 'the amount must be greater than 0');
       ELSE
          INSERT INTO Compte (NumCompte,
                               NumClient,
                               DateOuverture,
                               Solde,
                               PMVR)
               VALUES (seqCompte.NEXTVAL,
                       NumCli,
                       TO_DATE (sysdate, 'DD.MM.YY'),
                       Montant,
                       0);
       END IF;
    EXCEPTION
       WHEN 
       	client_inexistant
       THEN
          DBMS_OUTPUT.PUT_LINE (
             'Client No' || TO_CHAR (NumCli) || ' non-existent');
       WHEN OTHERS
       THEN
          DBMS_OUTPUT.PUT_LINE (
             'Oracle error:' || SQLCODE || '; Oracle message: ' || SQLERRM);
    END;
     
     execute OuvrirCompte(101,1600);

  2. #2
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2014
    Messages : 257
    Points : 395
    Points
    395
    Par défaut
    Bonjour,

    J'ai comme l'impression que ça manque de COMMIT et de ROLLBACK non ?

    Bisous bisous

  3. #3
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    1/ Merci d'éditer votre post en encadrant le code PLSQL de la balise CODE (le # dans les icônes).
    2/ Jamais de to_date sur une date : Une date est une date, un to_date transforme une chaîne de caractère en date, un to_char transforme une date en chaîne de caractère
    3/ Si rien ne se passe c'est que la procédure s'est exécutée dans problème. Vu qu'il y a des exceptions qui font du dbms_output, il s'agit probablement de ça.
    4/ Pour debuger, il suffit de mettre en commentaire tout le code sauf le minimum, tester, puis remettre une partie supplémentaire, tester, etc...


    exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE OR REPLACE PROCEDURE OuvrirCompte(NumCli IN NUMBER, Montant IN NUMBER)
    IS
    BEGIN
        INSERT INTO Compte (NumCompte, NumClient, DateOuverture, Solde, PMVR)
        VALUES (seqCompte.NEXTVAL, NumCli, TRUNC(SYSDATE), Montant, 0);
    END;
    puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE OR REPLACE PROCEDURE OuvrirCompte(NumCli IN NUMBER, Montant IN NUMBER)
    IS
    BEGIN
    	IF Montant < 0
      THEN
        RAISE_APPLICATION_ERROR (-20002, 'the amount must be greater than 0');
      END IF;
     
      INSERT INTO Compte (NumCompte, NumClient, DateOuverture, Solde, PMVR)
      VALUES (seqCompte.NEXTVAL, NumCli, TRUNC(SYSDATE), Montant, 0);
    END;

    etc..
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Supprimez le bloc WHEN OTHERS
    Utilisez raise_application_error dans le bloc client_inexistant
    Pour activer l'affichage de dbms_output faites un set serveroutput on dans sqlplus (ou sqldeveloper) avant d'exécuter la procédure.

  5. #5
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    Pour activer l'affichage de dbms_output faites un set serveroutput on dans sqlplus (ou sqldeveloper) avant d'exécuter la procédure.
    Je dirais d'une autre façon que, pour afficher quelque chose à l'écran en PL/SQL, il faut effectivement faire un set serveroutput on sous SQL*Plus.

    Après, si tu es le seul à manipuler cette table, tu peux faire un SELECT count(*) AVANT de lancer la procédure, lancer celle-ci puis refaire un SELECT count(*) après pour voir si on a +1 ou non.

    skuatamad, pourquoi supprimer le WHEN OTHERS? Si une erreur du genre "Table en mode Read Only" arrive, on la verra avec cette instruction.
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  6. #6
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Citation Envoyé par Ikebukuro Voir le message
    skuatamad, pourquoi supprimer le WHEN OTHERS? Si une erreur du genre "Table en mode Read Only" arrive, on la verra avec cette instruction.
    Ben non, car si l'affichage n'est pas activé on aura seulement "procédure exécutée avec succès"

    Sans bloc WHEN OTHERS le programme plante et l'erreur remonte à l'appelant (par exemple s'affiche à l'écran sqlplus).

    Si on utilise WHEN OTHERS, il faut au moins faire quelque chose d'utile avec comme logguer l'erreur, et bien sûr ne pas oublier de la renvoyer (raise) l'erreur.
    Mais le problème c'est qu'on perd la ligne exact en erreur, la ligne indiquée dans le message devient la ligne du raise.

  7. #7
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Exactement je suis avec Skuatamad, et c'est ce que j'ai dit :
    3/ Si rien ne se passe c'est que la procédure s'est exécutée dans problème. Vu qu'il y a des exceptions qui font du dbms_output, il s'agit probablement de ça.


    De plus je pense que le code est un code de dev, et donc pour avoir l'erreur, il faut épurer tout afin de comprendre ce qui arrive.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Consultant MOE-MOA Finance
    Inscrit en
    Novembre 2019
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant MOE-MOA Finance
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2019
    Messages : 17
    Points : 36
    Points
    36
    Par défaut
    Bonjour, déjà il y a un petit problème sur la ligne TO_DATE (sysdate, 'DD.MM.YY').
    Sysdate est déjà de type DATE donc si votre colonne COMPTE.DateOuverture est déclarée de type DATE, il faut juste remplacer TO_DATE (sysdate, 'DD.MM.YY') par sysdate et si votre colonne est de type VARCHAR2 il faut mettre TO_CHAR(sysdate, 'DD.MM.YY')

    Pour la fonction To_Date, le premier paramètre devrait être de type VARCHAR2 donc il faut pas lui passer un paramètre de type DATE. ça génère l'erreur ORA-01861 - Literal does not match format string

Discussions similaires

  1. passage d'un nom de table dans une procédure stockée
    Par thierry V dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 26/07/2010, 16h48
  2. Transformation de date dans une procédure stockée
    Par bd0606 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 27/10/2003, 11h31
  3. petit probleme dans une requte POSTGRE SQL
    Par ghis le fou dans le forum Requêtes
    Réponses: 5
    Dernier message: 08/09/2003, 13h51
  4. Probleme dans une clause like !
    Par adil dans le forum Langage SQL
    Réponses: 6
    Dernier message: 15/07/2003, 16h47
  5. Fin de programme dans une procédure
    Par Sinclair dans le forum Langage
    Réponses: 13
    Dernier message: 29/11/2002, 22h30

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