PC SOFT

PROFESSIONAL NEWSGROUPS
WINDEVWEBDEV and WINDEV Mobile

Home → WEBDEV 2024 → fonction stockée
fonction stockée
Started by Pierre, Jul., 19 2005 9:47 AM - 2 replies
Posted on July, 19 2005 - 9:47 AM
Bonjour, j'ai un probleme, j'ai des fonctions et procedures stockées dans une basse oracle, que j'accede par l'acces natif webdev. Mais comment fait on pour les invoker sous webdev?
Merci de votre aide
Posted on July, 19 2005 - 10:52 AM
Bonjour,

Voici un exemple complet. Attention, cet exemple nécessite une version
minimum 90023C des accès natif.



//Pour la connexion

sNomConnexion est une chaîne="ConnexionDriversNatif"



//Pour créer la procédure stockée (dans cet exemple elle n'existe pas sur le
serveur)

ReqCréationProc est une Source de Données //Source
pour la requête

sCodeSQLDeCréation est une chaîne //Code SQL de création de la procédure
stockée



//Pour l'exécution de la procédure/fonction stockée

ReqExécutionProc est une Source de Données //Source pour
la requête

sCodeSQLExécutionProc est une chaîne //Code SQL pour exécuter la
procédure stockée

bSQLServer est un booléen





bSQLServer=(SELTYPEBASE=1) //Vrai pour SQLSErveur, Faux pour Oracle

//avec SELTYPEBASE un sélecteur de la fenêtre avec deux options : "SQL
Server" et "Oracle"



// 1 --------------- (Si pas dèja faite) Connexion à la base de données (on
considère ici que la connexion n'a pas été faite avant dans la projet)

//avec CHPUTILISATEUR,CHPPASS,CHPSOURCE,CHPBASE des champs de saisie de la
fenêtre

SI bSQLServer ALORS

HOuvreConnexion(sNomConnexion,CHPUTILISATEUR,CHPPASS,CHPSOURCE,CHPBASE,hAccèsNatifSQLServer)

SINON

HOuvreConnexion(sNomConnexion,CHPUTILISATEUR,CHPPASS,CHPSOURCE,CHPBASE,hAccèsNatifOracle)

FIN



SI ErreurDétectée ALORS

Erreur(HErreurInfo())

RETOUR

FIN



// 2 --------------- (Optionnel) Création de la procédure stockée (dans cet
exemple elle n'existe pas sur le serveur)

// Si la procédure existe dèja sur le serveur cette phase n'est pas
nécessaire.



//Ici 4 parametres

//- a en entré

//- b en entré/sortie

//- c en sortie

//- d en entré/sortie

//Et une valeur de retour



//Cas concrêt

SI bSQLServer ALORS

//cas SQL SERVEUR :

//Dans le code SQL pour SQL Server de création d'une procédure sockée, la
syntaxe pour les paramètres est du type :

// @<NomParamtre> <Type> [IN] [OUT]

//avec :

// - @ suivit du nom du paramètres,

// - puis le type du paramètre

// - Rien si le paramètre est en entré,

// - puis OUTPUT, si le paramètre est en sortie



sCodeSQLDeCréation=[

CREATE PROCEDURE ProcStcAvecParamEtRetour(@a float, @b float
OUTPUT, @c datetime OUTPUT , @d numeric(4,2) OUTPUT) AS

SELECT

@b=@b*3 + @a,

@c='20051111 09:09:00',

@d= 8 * 3.14

return @b+1

]

SINON

//cas ORACLE :

//Dans le code SQL pour SQL Server de création d'une procédure sockée, la
syntaxe pour les paramètres est du type :

// <NomParamtre> [IN] [OUT] <Type>

//avec :

// - Nom du paramètres,

// - puis IN si le paramètre est en entré,

// - puis OUT, si le paramètre est en sortie (les deux sont possibles : IN
OUT)

// - puis le type du paramètre

//Puis dans la code de la procédure la paramètre est sufixé de deux points
(:)

sCodeSQLDeCréation=[

CREATE OR REPLACE FUNCTION ProcStcAvecParamEtRetour(a IN float, b IN OUT
float, c OUT date, d IN OUT number) return float is begin b:=b*3 + a;
c:='11/11/05'; d:= 8 * 3.14; return b+1; end;

]

FIN



//Demande de création de la procédure au serveur

//suppression de la procédure stockée si elle existe dèja (SQL SERVER
uniquement, car "CREATE OR REPLACE" en ORACLE)

SI bSQLServer ALORS
HExécuteRequêteSQL(ReqCréationProc,sNomConnexion,hRequêteSansCorrection,"DROP
PROCEDURE ProcStcAvecParamEtRetour")

//ATTENTION : il faut impérativement spécifer hnobind en plus de
hRequêteSansCorrection pour SQL Serveur

//hnobind permet à SQL Serveur de ne pas essayer de faire un bind, car ici
on est en création de la procédure stockée , et in ne veut pas remplacer les
paramètres par leur valeur !

SI
HExécuteRequêteSQL(ReqCréationProc,sNomConnexion,hRequêteSansCorrection+hNoBind,sCodeSQLDeCréation)
ALORS

HAnnuleDéclaration(ReqCréationProc) //Libération des ressource
de la requête

SINON

Erreur("Impossible de créer la procédure (fonction) stockée ",
HErreurInfo())

HAnnuleDéclaration(ReqCréationProc) //Libération des ressource
de la requête

HFermeConnexion(sNomConnexion) //Déconnexion car la connexion a
été faite ici

RETOUR

FIN





//3 --------------- (Optionnel) Utilisation de HPrépareRequêteSQL pour
optimiser des exécution succéssives de la procédure

//Note : les nom des paramètres doivent être les mêmes que les noms indiqués
dans la procédure sur le serveur

SI bSQLServer ALORS

//SQLServer :

HPrépareRequêteSQL(ReqExécutionProc,sNomConnexion,hRequêteSansCorrection,"ProcStcAvecParamEtRetour
@a @b @c @d")

SINON

//Oracle :

HPrépareRequêteSQL(ReqExécutionProc,sNomConnexion,hRequêteSansCorrection,"begin
:return_value :=ProcStcAvecParamEtRetour(:a,:b,:c,:d);end;")

//Note : Ici la valeur de retour de la procédure stockée est mis
dans une variable (return_value pour avoir un code identique avec SQL
Server)

//Cela facilite sa récupération

FIN

SI ErreurDétectée ALORS

Erreur("Impossible de préparer la procédure (fonction) stockée
", HErreurInfo())

HAnnuleDéclaration(ReqExécutionProc) //Libération des ressource
de la requête

HFermeConnexion(sNomConnexion) //Déconnexion car la connexion a
été faite ici

RETOUR

FIN



//4 --------------- (Optionnel) Exécution de la procédure sotckée

//Initialisation des 4 parametres

ReqExécutionProc.a=2 //Paramètre en entré

ReqExécutionProc.b=4 //Paramètre en entré/Sortie

//Paramètre en sortie, donc inutle de l'affecter : ReqExécutionProc.c

ReqExécutionProc.d=7 //Paramètre en entré/Sortie



//Exécution de la requête préparé

HExécuteRequêteSQL(ReqExécutionProc)

//Si la procdure n'est pas préparée (pas de phase 3), il faut écrire :

//SI bSQLServer ALORS

// //SQLServeur

//
HExécuteRequêteSQL(ReqExécutionProc,sNomConnexion,hRequêteSansCorrection,"ProcStcAvecParamEtRetour
@a @b @c @d")

//SINON

// //Oracle

//
HExécuteRequêteSQL(ReqExécutionProc,sNomConnexion,hRequêteSansCorrection,"begin
:return_value :=ProcStcAvecParamEtRetour(:a,:b,:c,:d);end;")

// //Note : Ici la valeur de retour de la procédure stockée est mis
dans une variable (return_value pour avoir un code identique avec SQL
Server)

// //Cela facilite sa récupération

//FIN



SI ErreurDétectée ALORS

Erreur("Impossible d'exécuter la procédure (fonction) stockée ",
HErreurInfo())

HAnnuleDéclaration(ReqExécutionProc) //Libération des ressource
de la requête

HFermeConnexion(sNomConnexion) //Déconnexion car la connexion a
été faite ici

RETOUR

SINON

//La procédure s'est exécute, récupération des valeurs modifiés

Info("Valeur de A : "+ReqExécutionProc.a,... //Paramètre en
entré (n'a pas changé car en entré uniquement)

"Valeur de B : "+ReqExécutionProc.b,... //Paramètre
en entré/Sortie

"Valeur de C : "+ReqExécutionProc.c,... //Paramètre
en sortie

"Valeur de D : "+ReqExécutionProc.d,... //Paramètre
en entré/Sortie

"Valeur de retour :
"+ReqExécutionProc.return_value)//Et récupération de la valeur de retour

//Avec ORACLE :

//"Valeur de retour :
"+ReqExécutionProc.return_value)//Et récupération de la valeur de retour



HAnnuleDéclaration(ReqExécutionProc) //Libération des ressource
de la requête

HFermeConnexion(sNomConnexion) //Déconnexion car la connexion a
été faite ici

FIN



//---------------------------

//Retour affiché :

//Valeur de A : 2

//Valeur de B : 14

//Valeur de C : nov 11 2005 09:09AM //(en SQL Server) ou 11/11/05 (en
Oracle)

//Valeur de D : 25

//Valeur de retour : 15

//---------------------------




--
Ed en Ligne


"Pierre" <Pierrot162@laposte.fr> a écrit dans le message de news:
42dc890f$1@news.pcsoft.fr...


Bonjour, j'ai un probleme, j'ai des fonctions et procedures stockées dans
une basse oracle, que j'accede par l'acces natif webdev. Mais comment fait
on pour les invoker sous webdev?
Merci de votre aide
Posted on July, 20 2005 - 3:14 AM
Merci pour cette explication