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

WinDev Discussion :

Exécution de procédures et functions Oracle 9i [WD10]


Sujet :

WinDev

  1. #1
    Candidat au Club
    Inscrit en
    Août 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Exécution de procédures et functions Oracle 9i
    Bonjour,

    Je désire exécuter des procédures stockées et des fonctions stockées (que j'aurai écrites) dans ma base Oracle 9i.

    C'est cette méthodologie que j'applique dans l'ensemble des projets informatiques auquels je participe. Que ce soit en C++, C#, Delphi, VBA ...

    En effet, le fait d'écrire les requêtes en dur dans le code WinDev nécessite, en cas de correctif, une nouvelle compilation, une nouvelle livraison et un nouveau déploiement.

    Il doit bien être possible tout de même d'exécuter une procédure stockée à partir de WinDev en passant les paramètres en entrées et en récupérant le résultat dans WinDev.

    Voici l'exemple d'une procédures tockée qui prends en entrée un login et mot de passe, et renvoie l'identifiant de l'utilisateur désigné, l'identifiant et le nom de son groupe ainsi que l'identifiant du responsable de son groupe.

    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
    CREATE OR REPLACE  PROCEDURE OGBC_CHECK_CONNECTION (
      login in bctbutilisateur.util_login%type,
      pwd in bctbutilisateur.util_pwd%type,
      idGroupe out bctbgroupe.grpe_id%type,
      nomGroupe out bctbgroupe.grpe_nom%type,
      idRespGroupe out bctbgroupe.rgpe_id%type,
      idUser out bctbutilisateur.util_id%type
    )
    IS
    BEGIN
     
    SELECT  g.grpe_nom,
            g.grpe_id,
            rg.util_id,
            u.util_id
    INTO  nomGroupe,
          idGroupe,
          idRespGroupe,
          idUser
    FROM  bctbutilisateur u,
          bctbgroupe g,
          bctbresponsable_groupe rg
    WHERE g.grpe_id = u.grpe_id
    AND   g.grpe_id = rg.grpe_id
    AND   u.util_login = login
    AND   u.util_pwd = pwd;
     
    END;
    Via cette requête (dans l'analyseur de requête) ça marche très bien.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    variable temp1 number;
    variable temp2 varchar2(50)
    variable temp3 number
    variable temp4 number
    call ogbc_check_connection('rp', 'rp', :temp1, :temp2, :temp3, :temp4);
    print :temp1
    print :temp2
    print :temp3
    print :temp4
    Par contre, à partir de WinDev je tourne en rond, pas moyen de l'exécuter.

    Merci de votre aide.

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    Tu es passé par la case F1 ?

    Il te faut tout d'abord une connexion active sur la base Oracle(j'imagine que tu sais le faire)

    Ensuite voila la procédure à suivre ( Tiré de l'aide Windev ) :


    La procédure stockée 'sp_cut(n,str)' tronque la chaîne 'str' aux 'n' premiers caractères et renvoie l'ancienne longueur de chaîne.

    [IMG smallblue.gif] n est une variable d'entrée.

    str est une variable d'entrée / sortie.





    1. Déclaration de la source de données

    La source de données permet de manipuler les différentes variables de la procédure à exécuter.



    MaProc est une source de données







    2. Déclaration des variables utilisées par la procédure

    La déclaration des variables manipulées par la procédure se fait à partir de la source de données.



    MaProc.n = 3 // Déclare automatiquement un entier initialisé à 3
    MaProc.str = "Exemple"



    Remarque : Il n'est pas obligatoire de déclarer toutes les variables utilisées. Dans cet exemple, la variable utilisée pour connaître le résultat de la procédure n'est pas déclarée.





    3. Exécution de la requête et récupération du résultat

    Pour exécuter la requête, il suffit d'utiliser la fonction HExécuteRequêteSQL :



    HExécuteRequêteSQL(MaProc,Connexion,hRequêteSansCorrection,...
    "begin :Res :=sp_cut(:n,:str);end;")
    Info(MaProc.Res)



    Après l'exécution de la requête, la variable MaProc.str contient "exe", et la variable MaProc.res contient 7.
    J'espère que ca t'avancera un peu
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  3. #3
    Candidat au Club
    Inscrit en
    Août 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Oui, j'ai déjà une connexion active et qui marche.

    Quand à cet exemple je l'ai déjà lu mais pas très utile.
    sp_cut est une fonction préféfinie d'Oracle, ce n'est pas une procédure ou une fonction stockée.
    Et supposons, elle ne renvoie qu'une unique valeur, moi dans ce cas très simple je veux déjà en récupérer 4.
    Mais j'aurai besoin d'en récupérer beaucoup plus.

  4. #4
    Candidat au Club
    Inscrit en
    Août 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Voici le code WinDev avec lequel j'essaye d'exécuter la procédure stockée que j'ai énoncée plus haut.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    RqtSql.grpe_id = -1
    RqtSql.grpe_nom = ""
    RqtSql.grpe_id = -1
    RqtSql.util_id = -1
     
    CodeSql = "BEGIN CALL OGBC_CHECK_CONNECTION('"+ clUser:m_sLogin + "', '" + clUser:m_sPassword + "', :grpe_id, :grpe_nom, :rgpe_id, :util_id); END;"
     
    HExécuteRequêteSQL(RqtSql, CnxOracle, hRequêteSansCorrection, CodeSql)
     
    gnNumGroupe = RqtSql.grpe_id
    gsGroupe = RqtSql.grpe_nom
    gnNumResponsable = RqtSql.grpe_id
    gnNumUtilisateur = RqtSql.util_id

  5. #5
    Candidat au Club
    Inscrit en
    Août 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Je viens d'exécuter le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    MaProc est une Source de Données
    MaProc.n = 3 // Déclare automatiquement un entier initialisé à 3
    MaProc.str = "Exemple"
    MaProc.Res = 0
    HExécuteRequêteSQL(MaProc,CnxOracle,hRequêteSansCorrection,"begin :Res :=sp_cut(:n,:str);end;")
    Info(MaProc.Res)
    et le résultat est MaProc.Res = 0 et MaProc.str = "Exemple".

    J'ai également du initialiser la variable Res car autrement il y avait une erreur d'exécution WinDev sur la dernière ligne, comme quoi l'aide WinDev est de très bonne qualité.

    Je ne pense pas que cela provienne de la connection puisque dans le même fonction WinDev il y avait anciennement le code suivant qui marchait
    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
    CodeSql="SELECT * FROM bctbgroupe, bctbutilisateur,bctbresponsable_groupe "
    CodeSql=CodeSql+ "WHERE bctbgroupe.grpe_id=bctbutilisateur.grpe_id and bctbgroupe.grpe_id=bctbresponsable_groupe.grpe_id  "
    CodeSql=CodeSql+ "and bctbutilisateur.util_login= '" + clUser:m_sLogin + "' and bctbutilisateur.util_pwd='" + clUser:m_sPassword + "'"
    HExécuteRequêteSQL(RqtSql,CnxOracle,hRequêteSansCorrection,CodeSql)
    HLitPremier(RqtSql)
     
    SI HEnDehors(RqtSql) ALORS
    	CodeSql="SELECT * FROM bctbutilisateur "
    	CodeSql=CodeSql+ "WHERE bctbutilisateur.util_login= '" + clUser:m_sLogin + "' and bctbutilisateur.util_pwd='" + clUser:m_sPassword + "'"
    	HExécuteRequêteSQL(RqtSql,CnxOracle,hRequêteSansCorrection,CodeSql)
    	HLitPremier(RqtSql)
    	gsGroupe=""
    	gnNumGroupe=0
    	gnNumResponsable=0
    SINON
    	//Utilisateur connecté existe en Bdd : récupération du groupe et de son identifiant
    	gsGroupe=RqtSql.grpe_nom
    	gnNumGroupe=RqtSql.grpe_id
    	gnNumResponsable=RqtSql.rgpe_id
    FIN
    gnNumUtilisateur=RqtSql.util_id

  6. #6
    Candidat au Club
    Inscrit en
    Août 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Autant pour moi concernant sp_cut, j'avais compris que c'était une fonction d'Oracle.
    Aurais tu le code SQL de cette fonction ?
    Merci.

  7. #7
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2006
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 1
    Points : 1
    Points
    1
    Par défaut procédure plsql lancée depuis windev
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    requete=" begin procedure_stockée(p1,p2.....pn); end;"
     
    sqlexec(requete,"nom_requete")

    en fait on est très proche de ce que vous aviez fait mais sans le call dans la requête.

    A+

  8. #8
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 242
    Points : 56
    Points
    56
    Par défaut
    Et si c'est une fonction stockée comment on fait pour récupérer la valeur de retour ?

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

Discussions similaires

  1. Exécuter une procédure stockée PL/SQL Oracle sous Talend
    Par robinson50 dans le forum Développement de jobs
    Réponses: 4
    Dernier message: 03/11/2008, 10h51
  2. [ADO]Exécuter une procédure stockée Oracle
    Par randriano dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 21/04/2008, 12h55
  3. DBLink et exécution de procédure stockée
    Par DBS dans le forum Oracle
    Réponses: 8
    Dernier message: 01/02/2005, 13h50
  4. Executer procédure stockée base oracle ADOStoredProc
    Par Akei dans le forum Bases de données
    Réponses: 2
    Dernier message: 21/06/2004, 08h46

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