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 stockée - recevoir résultat (in / out en même temps)


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant / Technicien informatique
    Inscrit en
    Novembre 2004
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant / Technicien informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 30
    Par défaut Procédure stockée - recevoir résultat (in / out en même temps)
    Bonjour à tous, j'ai un devoir pour l'université qui consiste à créer un petit logiciel en utilisant une base de données Oracle. Dans le travail, il est demandé que toutes les accès à la base de données soient faites via des procédures stockées. Comme projet, je veux faire un petit système de facture avec des pièces informatiques. Je veux donc gérer une partie parent (le client) ainsi qu'une partie enfant (les éléments de la facture).

    J'aimerais fonctionner de la façon suivante : j'entre le numéro du client et les informations (nom, prénom, adresse et numéro de téléphone) apparaissent automatiquement dans les TextBox prévues à cet effet.

    Ma procédure stockée.
    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
     
    create or replace
    PROCEDURE GETCLIENTINFO(
      p_clientid in varchar2,
      p_clientnom out varchar2,
      p_clientprenom out varchar2,
      p_clientadresse out varchar2,
      p_clienttelephone out varchar2
    ) AS
     
    BEGIN  
      select clientnom, clientprenom, clientadresse, clienttelephone
      into p_clientnom, p_clientprenom, p_clientadresse, p_clienttelephone
      from client
      where clientid = p_clientid;
      commit;
     
    END GETCLIENTINFO;
    Le code dans mon logiciel C#.
    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
     
    private void btnClient_Click(object sender, EventArgs e)
            {
                OracleParameter[] collection = {    
                    //new OracleParameter("p_factureID", OracleType.Number, 0, System.Data.ParameterDirection.Input, null, System.Data.DataRowVersion.Default, true, 3),
     
                    new OracleParameter("p_clientid", OracleType.VarChar, 0, System.Data.ParameterDirection.Input, null, System.Data.DataRowVersion.Default, true, txtClientID.Text),
                    new OracleParameter("p_clientnom", OracleType.VarChar, 0, System.Data.ParameterDirection.Output, null, System.Data.DataRowVersion.Default, true, 0),
                    new OracleParameter("p_clientprenom", OracleType.VarChar, 0, System.Data.ParameterDirection.Output, null, System.Data.DataRowVersion.Default, true, 0),
                    new OracleParameter("p_clientadresse", OracleType.VarChar, 0, System.Data.ParameterDirection.Output, null, System.Data.DataRowVersion.Default, true, 0),
                    new OracleParameter("p_clienttelephone", OracleType.VarChar, 0, System.Data.ParameterDirection.Output, null, System.Data.DataRowVersion.Default, true, 0)
     
                           };
                //MessageBox.Show("IDClient : " + txtClientID.Text);
                interfaceBD.appelerProcedureStockee("GETCLIENTINFO", collection);
                MessageBox.Show("Résultat : " + collection[2].Value.ToString());
                //txtClientNom.Text = collection[1].Value.ToString();
            }
    interfaceBD est une interface que notre enseignant nous a donné afin de simplifier les connexions/déconnexions à la BDD. En gros, le code ci haut prend comme premier paramètre mon texte dans ma TextBox et les 4 autres sont des sorties que j'aimerais voir afficher.

    Par contre, quand j'exécute mon logiciel, que je rentre un ID de client, j'obtiens l'erreur suivante.

    ORA-06502 : PL/SQL : erreur numérique ou erreur sur une valeur
    ORA-06512 : à "SMI1002_14.GETCLIENTINFO", ligne 14
    ORA-06512 : à ligne 1
    La ligne 14 correspond au BEGIN dans ma procédure stockée. J'ai effacé les commentaires que j'avais placé pour des fins de tests.

    Je sais que c'est un peu long comme post, mais j'ai passé plus de 4 heures aujourd'hui à essayer de résoudre le problème sans succès. Si une âme charitable aurait un tuyau pour moi, je lui serais très reconnaissant.

    Merci beaucoup et bonne journée (ou soirée) à vous tous.

  2. #2
    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
    Commencez par tester votre procédure PL/SQL dans sqlplus ou mieux sqldevelopper et seulement après passez au code C#. Par exemple: voilà la procédure getEmpInfo
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    CREATE OR REPLACE Procedure getEmpInfo (
      p_empno         In  emp.empno%Type,
      p_ename         Out emp.ename%Type,
      p_job           Out emp.job%Type
    ) Is
    Begin
      Select ename, job
        Into p_ename, p_job
        From emp
       Where empno = p_empno;
    End;
    Et le test avec sqlplus
    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
     
    SQL*Plus: Release 10.2.0.1.0 - Production on Mer. Avr. 28 08:53:17 2010
     
    Copyright (c) 1982, 2005, Oracle.  All rights reserved.
     
     
    ConnectÚ Ó :
    Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production
     
    SQL> variable p_empno number
    SQL> variable p_ename varchar2(10)
    SQL> variable p_job varchar2(9)
    SQL> exec :p_empno := 7369
     
    ProcÚdure PL/SQL terminÚe avec succÞs.
     
    SQL> exec getEmpInfo(:p_empno, :p_ename, :p_job)
     
    ProcÚdure PL/SQL terminÚe avec succÞs.
     
    SQL> print p_ename
     
    P_ENAME
    --------------------------------
    SMITH
     
    SQL> print p_job
     
    P_JOB
    --------------------------------
    CLERK
     
    SQL>
    Le commit à l'intérieur de votre procédure indique que vous devez passer un peu de temps pour réviser vos leçons.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant / Technicien informatique
    Inscrit en
    Novembre 2004
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant / Technicien informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 30
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Commencez par tester votre procédure PL/SQL dans sqlplus ou mieux sqldevelopper et seulement après passez au code C#. Par exemple: voilà la procédure getEmpInfo

    Le commit à l'intérieur de votre procédure indique que vous devez passer un peu de temps pour réviser vos leçons.
    Quand j'excute ma procédure dans SQLDevelopper directement, ça passe. Mais concernant le commit, je vais aller me renseigner.

    Merci.

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant / Technicien informatique
    Inscrit en
    Novembre 2004
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant / Technicien informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 30
    Par défaut
    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
     
    SQL> variable p_clientid varchar2(10)
    SQL> variable p_clientnom varchar2(20)
    SQL> variable p_clientprenom varchar2(20)
    SQL> variable p_clientadresse varchar2(30)
    SQL> variable p_clienttelephone varchar2(10)
    SQL> exec :p_clientid := 1111111
     
    Procédure PL/SQL terminée avec succès.
     
    SQL> exec getclientinfo(:p_clientid, :p_clientnom, :p_clientprenom, :p_clientadresse, :p_clienttelep
    hone)
     
    Procédure PL/SQL terminée avec succès.
     
    SQL> print p_clientnom
     
    P_CLIENTNOM
    --------------------------------------------------------------------------------
    Higgins
    Je viens d'essayer ça et ça fonctionne pourtant dans SQLPlus ainsi que dans SQL Developer. J'ai aussi vérifié et effectivement, il n'y a pas de commit à mettre.

    Malheureusement, ça ne fonctionne toujours pas et je ne sais plus trop quoi faire.

  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 [R]Viper Voir le message
    Je viens d'essayer ça et ça fonctionne pourtant dans SQLPlus ainsi que dans SQL Developer. J'ai aussi vérifié et effectivement, il n'y a pas de commit à mettre.
    Trés bien!
    Malheureusement, ça ne fonctionne toujours pas et je ne sais plus trop quoi faire.
    Vous devez commencer par comprendre l'anomalie. Regardez donc dans la documentation d'Oracle que est-ce que ça veut dire
    ORA-06502 PL/SQL: numeric or value error string

    Cause: An arithmetic, numeric, string, conversion, or constraint error occurred. For example, this error occurs if an attempt is made to assign the value NULL to a variable declared NOT NULL, or if an attempt is made to assign an integer larger than 99 to a variable declared NUMBER(2).

    Action: Change the data, how it is manipulated, or how it is declared so that values do not violate constraints.
    Donc si les variables ne sont pas correctement taillées (parce que dans votre cas il n'y pas de contrainte NULL) cela provoque l'anomalie.
    Réessayons dans sqlplus
    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
     
    SQL> variable p_empno number
    SQL> variable p_ename varchar2(3)
    SQL> variable p_job varchar2(9)
    SQL> exec :p_empno := 7369
     
    Procédure PL/SQL terminée avec succès.
     
    SQL> exec getEmpInfo(:p_empno, :p_ename, :p_job)
    BEGIN getEmpInfo(:p_empno, :p_ename, :p_job); END;
     
    *
    ERREUR à la ligne 1 :
    ORA-06502: PL/SQL : erreur numérique ou erreur sur une valeur
    ORA-06512: à "MNI.GETEMPINFO", ligne 7
    ORA-06512: à ligne 1
    Voilà une piste.

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant / Technicien informatique
    Inscrit en
    Novembre 2004
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant / Technicien informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 30
    Par défaut
    Citation Envoyé par mnitu Voir le message
    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
     
    SQL> variable p_empno number
    SQL> variable p_ename varchar2(3)
    SQL> variable p_job varchar2(9)
    SQL> exec :p_empno := 7369
     
    Procédure PL/SQL terminée avec succès.
     
    SQL> exec getEmpInfo(:p_empno, :p_ename, :p_job)
    BEGIN getEmpInfo(:p_empno, :p_ename, :p_job); END;
     
    *
    ERREUR à la ligne 1 :
    ORA-06502: PL/SQL : erreur numérique ou erreur sur une valeur
    ORA-06512: à "MNI.GETEMPINFO", ligne 7
    ORA-06512: à ligne 1
    Voilà une piste.
    Je crois comprendre ce que vous essayez de me faire comprendre. Or, j'ai bien fait attention à mes types. J'utilises des varchar2 lors de la création de ma table dans ma BDD.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    create table client
    (
      clientID varchar2(10) primary key,
      clientNom varchar2(20) not null,
      clientPrenom varchar2(20) not null,
      clientAdresse varchar2(30) not null,
      clientTelephone varchar2(10) not null
    );
    Si ce n'est pas ce que vous essayez de me faire comprendre, je ne vois pas alors.

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/12/2012, 13h14
  2. Procédure stockée et résultat de requetes vides
    Par Harry dans le forum HyperFileSQL
    Réponses: 6
    Dernier message: 09/08/2012, 11h13
  3. Procédure stockée - récupérer résultat requete
    Par kanak09 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 17/08/2010, 13h48
  4. Procédure Stockés et Résultat
    Par ZIED dans le forum Requêtes
    Réponses: 7
    Dernier message: 19/12/2008, 09h46
  5. Procédure stockée avec une variable "OUT"
    Par Cpas2latarte dans le forum SQL
    Réponses: 5
    Dernier message: 13/03/2007, 10h22

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