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

SQL Oracle Discussion :

procédure stockée Oracle depuis VB.net


Sujet :

SQL Oracle

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    351
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 351
    Par défaut procédure stockée Oracle depuis VB.net
    Bonjour,
    j'ai un problème lorsque j'appelle une procédure stockée depuis mon code VB.
    Ma procédure stockée est la suivante :
    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
    create or replace PROCEDURE SELECTABONNES 
    (
     nom XABO.NOMABO%type,
     prenom XABO.PNOMABO%type,
     telephone XABO.TELABO%type,
     libelleService XSCE.LBLSCE%type
    )
    As
    abo XABO.NUMABO%type;
    service XABO.SCEABO%type := TAX.SELECTSERVICE(libelleService);
     
    BEGIN
      SELECT NUMABO
      INTO abo
      FROM XABO 
      WHERE NOMABO = nom 
      AND PNOMABO = prenom
      AND SCEABO  = service;
    EXCEPTION
      WHEN no_data_found THEN
            BEGIN
              INSERT INTO XABO (NUMABO, NOMABO, PNOMABO, TELABO, SCEABO)
              VALUES (sequenceabo.nextval, nom, prenom, telephone, service );
            END; 
     
    END SELECTABONNES;
    Elle fait appel à une fonction que j'ai créé qui se nomme SELECTSERVICE.

    Lorsque je suis sous Oracle, elle fonctionne (la compilation ne sort pas d'erreur

    Mais lorsque je lance la procédure stockée depuis mon programme VB, il me sort l'erreur suivante
    ORA-06550: line 1, column 7:
    PLS-00221: 'SELECTSITE' is not a procedure or is undefined
    ORA-06550: line 1, column 7:
    PL/SQL: Statement ignored
    Je ne sais pas pourquoi il ne veut pas la prendre. Je pense que certains ont déjà dû avoir l'erreur, aidez moi siouplè

    merci

  2. #2
    Membre émérite Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Par défaut
    Salut,
    il semble que ta fonction SELECTSERVICE se trouve dans le package TAX

    est-ce que ce package est dans le même schéma ?

    si oui, est-ce le schéma que tu utilises pour te connecter depuis ton appli VB ?

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    351
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 351
    Par défaut
    oui, tax en fait c'est la connexion donc.
    Tout est dans la meme base, c'est ca que je ne comprends pas.
    c'est quoi que tu appelles schéma? pas de schéma sous oracle . J'ai mes tables, mes séquences, mes fonctions, procédures...mais pas de schéma

    est-ce qu'il est nécessaire, quand je créé mes procédures et fonctions, que je mettes "TAX." avant le nom de chaque procédure?

  4. #4
    Membre émérite Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Par défaut
    ok, alors essayes d'enlexer TAX avant SelectService.

    En fait un schéma = un user.
    dans une base Oracle, chaque user peut posséder ses propres tables, séquences, index, procédures, etc...

    en général on a un (ou plusieurs) schémas "maîtres" ou "applicatifs" qui contiennent les objets et les données relatives à une application, puis des users qui n'ont pas d'objets à eux, mais des droits sur les objets du schéma applicatifs (droit de Select sur certaines tables, droit d'exécution certaines procédures, etc...)...

    comme ça, chacun se connecte avec son propre username/password, mais accède aux objets centralisés dans le schéma applicatif...

    bien sûr tu peux avoir plusieurs schémas applicatifs dans une base, et ainsi gérer les objets et les données de plusieurs applications distinctes dans une seule base de donnée.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    351
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 351
    Par défaut
    Merci bien pour tes explications sur le fonctionnement des users ^^. J'en sais un peu plus sur le fonctionnement

    J'ai essayer d'enlever TAX avant l'appel de la fonction, j'obtiens exactement la même erreur.
    J'ai éxécuteéla procédure depuis Oracle SQL Developper (l'outil que j'utilise), et ça fonctionne, mais depuis le programme VB, toujours pareil comme je viens de le dire

  6. #6
    Membre émérite Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Par défaut
    je viens de me rendre compte d'une chose :

    tu as une erreur qui te parles d'une procédure SELECTSITE
    PLS-00221: 'SELECTSITE' is not a procedure or is undefined
    alors que nous on regarde la procédure SELECTABONNES, qui appelle SELECTSERVICE...

    y a pas quelque chose qui coince ? tu appelles bien la bonne procédure dans ton code VB ?

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    351
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 351
    Par défaut
    bien, pour que tu aies une bonne partie de mon code, je te donne les parties concernant cette procédure
    le VB :
    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
    Private Sub selectAbonnesProcStock(ByVal nom As String, ByVal prenom As _
    String, ByVal telephone As String, ByVal libelleService As String)
     
    '-------------------------------------------------------------------------
    '-----Connexion à la base de données Oracle des statistiques
    '-------------------------------------------------------------------------
        Dim cnx As New OracleConnection()
        cnx.ConnectionString = cnxTaxProcStock
        cnx.Open()
     
    '-------------------------------------------------------------------------
    '-----Appel de la procédure stockée avec passage des paramètres
    '-------------------------------------------------------------------------
        Dim command As New OracleCommand()
        command.Connection = cnx
        command.CommandType = CommandType.StoredProcedure
        command.CommandText = "SELECTABONNES"
        command.Parameters.Add(New OracleParameter("nom", OracleType.VarChar))
        command.Parameters("nom").Value = nom
        command.Parameters.Add(New OracleParameter("prenom", OracleType.VarChar))
        command.Parameters("prenom").Value = prenom
        command.Parameters.Add(New OracleParameter("libelleService", OracleType.VarChar))
        command.Parameters("libelleService").Value = libelleService
        command.Parameters.Add(New OracleParameter("telephone", OracleType.VarChar))
        command.Parameters("telephone").Value = telephone
     
    '-------------------------------------------------------------------------
    '-----Execution de la procédure stockée
    '-------------------------------------------------------------------------
        command.ExecuteNonQuery()
     
        'fermeture de la connexion
        cnx.Close()
    End Sub
    la procédure:
    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
    create or replace PROCEDURE SELECTABONNES
    /*vérification de l'existence/insertion d'un abonné GIP dans la base*/
    (
     nom XABO.NOMABO%type,
     prenom XABO.PNOMABO%type,
     telephone XABO.TELABO%type,
     libelleService XSCE.LBLSCE%type
    )
    As
    abo XABO.NUMABO%type;
    /*recherche/création du service auquel appartient l'abonné*/
    service XABO.SCEABO%type := TAX.SELECTSERVICE(libelleService);
     
    BEGIN
      /*recherche de l'abonné passé en parametre dans la base*/
      /*si il existe on ne fait rien*/
      SELECT NUMABO
      INTO abo
      FROM XABO 
      WHERE NOMABO = nom 
      AND PNOMABO = NVL(prenom,PNOMABO )
      AND SCEABO  = service;
    EXCEPTION
      /*abonné non trouvé, on le créé*/
      WHEN no_data_found THEN
            BEGIN
            /*Insertion de l'abonné*/
              INSERT INTO XABO (NUMABO, NOMABO, PNOMABO, TELABO, SCEABO)
              VALUES (sequenceabo.nextval, nom, prenom, telephone, service );
            END; 
     
    END SELECTABONNES;
    et la fonction :
    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
    CREATE OR REPLACE
    FUNCTION SELECTSERVICE (libelleService XSCE.LBLSCE%type)
    RETURN XABO.SCEABO%type
    AS
    service XABO.SCEABO%type;
     
      BEGIN
      SELECT NUMSCE
      INTO service
      FROM XSCE 
      WHERE LBLSCE = libelleService;
      return service;
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
          BEGIN
     
          SELECT sequenceserv.NEXTVAL
          INTO service
          FROM DUAL;
     
          INSERT INTO XSCE (NUMSCE, LBLSCE)
          VALUES (service, libelleService);
          return service;
          /*return SELECTSERVICE(libelleService);*/
          END;
    END SELECTSERVICE;
    j'appelle donc ma procédure stockée SELECTABONNES avec mes parametres, et dans cette procédure stockée, j'ai besoin de récupérer l'identifiant du service auquel est affecté mon abonné. Et cet identifiant je le récupère grace à la fonction SELECTSERVICE.
    EN VB, il arrive donc bien a rentrer dans ma procédure stockée, mais dès qu'il veut appeler ma fonction, eh bien l'erreur cité dans le topic apparait

  8. #8
    Membre éclairé
    Inscrit en
    Novembre 2004
    Messages
    312
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 312
    Par défaut
    Qui est le propriétaire de ta proc et ta fonction ?

    Avec quel compte Oracle te connectes-tu via ton applicatif ?

  9. #9
    Membre émérite Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Par défaut
    Clairement je pense que nous sommes face à un problème de droit...
    le username que tu utilises pour te connecter depuis ton appli VB ne connait pas tous les composants, notament la fonction SELECTSERVICE.

    Qui est propriétaire de SELECTSERVICE ?

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    351
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 351
    Par défaut
    eh bien c'est moi le propriétaire de ma fonction et de ma procédure, et également des tables car c'est avec ma connexion à moi que j'ai tout créé.

    Et dans mon application VB, je me connecte avec le meme identifiant+mot de passe qu'avec Oracle SQL Developper.

    en gros, si on dit que mon identifiant :marcusien et mot de passe : marcusien
    avec Oracle SQL Developper, je me connecte avec Marcusien/Marcusien
    j'ai créé les fonctions et procédures avec ce logiciel et cette meme connexion
    dans mon VB, la connexion se fait en Marcusien/Marcusien

    Après, je sais pas si il y a des droits attribués pour que je ne puisse pas lire ma fonction depuis ma procédure stockée, mais ca me parait bizarre étant donné que j'arrive à l'executer depuis Oracle SQL Developper.

  11. #11
    Membre éclairé
    Inscrit en
    Novembre 2004
    Messages
    312
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 312
    Par défaut
    Il n'y aurait pas une déclaration de tes procs et fonctions à faire dans ton outil de développement ?

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    351
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 351
    Par défaut
    ....ben je crois pas, et de toute façon ca n'est pas lié, car moi je l'appelle en VB, il ne tient donc pas compte de l'outil qui a été utilisé.

    J'ai encore retesté, la procédure et fonction fonctionne correctement, quand je fais un RUN de ma procédure stockée, elle n'a aucun mal a appelé la fonction par la suite.

    je comprends rien

  13. #13
    Membre éclairé
    Inscrit en
    Novembre 2004
    Messages
    312
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 312
    Par défaut
    Citation Envoyé par marcusien
    ....ben je crois pas, et de toute façon ca n'est pas lié, car moi je l'appelle en VB, il ne tient donc pas compte de l'outil qui a été utilisé.
    Justement, ce que je te demande : n'as tu pas besoin de déclarer ta proc et ta fonction dans VB ?

  14. #14
    Membre émérite Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Par défaut
    Essaye peut-être une chose :
    dans ta procédure SELECTABONNES, essaye de délocaliser l'affectation de "service" après le Begin...
    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
    CREATE OR REPLACE PROCEDURE SELECTABONNES
    /*vérification de l'existence/insertion d'un abonné GIP dans la base*/
    (
     nom XABO.NOMABO%type,
     prenom XABO.PNOMABO%type,
     telephone XABO.TELABO%type,
     libelleService XSCE.LBLSCE%type
    )
    AS
    abo XABO.NUMABO%type;
    /*recherche/création du service auquel appartient l'abonné*/
    service XABO.SCEABO%type ;
     
    BEGIN
        service := SELECTSERVICE(libelleService);
    ...

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    351
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 351
    Par défaut
    Je vous remercie de m'aider

    j'ai trouvé une solution...apparemment c'est le commandtype de ma commande en VB qui n'aime pas être à "StoredProcedure". Je l'ai passé à "Text".
    En gros voici mon VB maintenant et il marche. Alors pour le problème, il est super bizarre malgré tout
    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
        Private Sub selectAbonnesProcStock(ByVal nom As String, ByVal prenom As String, ByVal telephone As String, ByVal libelleService As String)
     
    '-----------------------------------------------------------------------------------
    '-----Connexion à la base de données Oracle des statistiques
    '-----------------------------------------------------------------------------------
        Dim cnx As New OracleConnection()
        cnx.ConnectionString = cnxTaxProcStock
        cnx.Open()
     
    '-----------------------------------------------------------------------------------
    '-----Appel de la procédure stockée
    '-----------------------------------------------------------------------------------
        Dim command As New OracleCommand()
        command.Connection = cnx
        command.CommandType = CommandType.Text
        command.CommandText = "call(SELECTABONNES('" + nom + "','" + prenom + _
                                "','" + telephone + "','" + libelleService + "'))"
     
    ''-----------------------------------------------------------------------------------
    ''-----Execution de la procédure stockée
    ''-----------------------------------------------------------------------------------
     
        command.ExecuteNonQuery()
     
        'fermeture de la connexion
        cnx.Close()
     
    End Sub

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    351
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 351
    Par défaut
    Citation Envoyé par davy.g
    Justement, ce que je te demande : n'as tu pas besoin de déclarer ta proc et ta fonction dans VB ?
    ben...il faut juste l'appeler dans une command c'est tout

  17. #17
    Membre émérite Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Par défaut
    Dans le mesure du possible, évite d'utiliser le system.data.Oracleclient de Microsoft !

    utilise plutôt le Oracle.DataAccess de Oracle

    pour ça tu peux télécharger ODT.Net chez Oracle... tu t'évitera bien des problèmes de ce type ! seul Oracle sait vraiment gérer du Oracle !

  18. #18
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    351
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 351
    Par défaut
    d'accord, merci pour l'info. Le framework est bon, mais apparemment, le coup d'oracle ^^.
    En meme temps c'est normal qu'il y ait plus de bug avec oracle que SQL Server dans le framework ^^

    encore merci

  19. #19
    Membre éprouvé
    Inscrit en
    Octobre 2005
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 125
    Par défaut
    Perso pour pas me compliquer la vie j'utilise http://www.codeproject.com/vb/net/OracleSPWrapper.asp

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

Discussions similaires

  1. [XL-2010] Pas de retour sur un paramètre output depuis une procédure stockée oracle
    Par darmet dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 28/07/2014, 15h47
  2. Invoquer une procédure stockée Oracle depuis un bouton
    Par Pozzo dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/12/2008, 09h18
  3. Procédures stockées ORACLE 10g - JAVA 1.6
    Par poussinette0712 dans le forum JDBC
    Réponses: 2
    Dernier message: 27/03/2007, 01h49
  4. procédure stockée + Oracle
    Par BONNEFOI Patrick dans le forum Bases de données
    Réponses: 4
    Dernier message: 19/04/2005, 16h09
  5. procédure stockée Oracle dans delphi 6
    Par UPNE387 dans le forum Bases de données
    Réponses: 3
    Dernier message: 04/05/2004, 10h47

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