|
Iniciado por Pierrot162, jul., 19 2005 9:47 AM - 2 respostas |
| |
| | | |
|
| |
Publicado em julho, 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 |
| |
| |
| | | |
|
| | |
| |
Publicado em julho, 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
|
| |
| |
| | | |
|
| | |
| |
Publicado em julho, 20 2005 - 3:14 AM |
Merci pour cette explication |
| |
| |
| | | |
|
| | | | |
| | |
|