PC SOFT

DOCUMENTATION EN LIGNE
DE WINDEV, WEBDEV ET WINDEV MOBILE

  • Présentation
  • Comment le faire ?
  • Les étapes
  • Remarques
  • Exemple
  • 1. Déclaration de la source de données
  • 2. Déclaration des variables utilisées par la procédure
  • 3. Exécution de la requête et récupération du résultat
  • Fonctions et procédures renvoyant un curseur
  • Principe
  • Exemple : Fonction renvoyant un curseur
  • Exemple : Procédure avec un paramètre de type curseur
WINDEV
WindowsLinuxUniversal Windows 10 AppJavaEtats et RequêtesCode Utilisateur (MCU)
WEBDEV
WindowsLinuxPHPWEBDEV - Code Navigateur
WINDEV Mobile
AndroidWidget AndroidiPhone/iPadApple WatchUniversal Windows 10 AppWindows Mobile
Autres
Procédures stockées
Connecteur Natif Oracle : Récupérer la valeur de sortie d'une procédure stockée
Accès NatifsDisponible uniquement avec ce type de connexion
Présentation
Le Connecteur Natif Oracle (également appelé Accès Natif Oracle) permet de :
  • spécifier des valeurs d'entrées lors de l'appel à une procédure stockée.
  • récupérer des valeurs de sorties après l'appel d'une procédure stockée.
Remarques :
  • Il est également possible d'utiliser des variables dans tout type de requête.
  • Versions 18 et supérieures
    Les fonctions et procédures renvoyant un curseur peuvent également être exécutées.
    Nouveauté 18
    Les fonctions et procédures renvoyant un curseur peuvent également être exécutées.
    Les fonctions et procédures renvoyant un curseur peuvent également être exécutées.
Si la requête doit être exécutée plusieurs fois, il est possible de préparer la requête à exécuter (fonction HPrépareRequêteSQL) ainsi que les différents paramètres à modifier puis exécuter la requête autant de fois que nécessaire avec la fonction HExécuteRequêteSQL. Cette solution est rapide et optimise le temps de parcours du résultat de la requête (cas d'une requête de type SELECT).
Comment le faire ?

Les étapes

Pour spécifier et récupérer des valeurs lors de l'exécution d'une requête, il faut :
  1. Déclarer une source de données. Cette source de données contiendra le résultat de la requête SQL.
  2. Déclarer les différentes variables de la requête (variables d'entrées et variables de sorties).
    Les variables sont récupérées dans le type spécifié en WLangage. Par défaut les variables sont de type texte.
    Des conversions peuvent donc se produire du type natif de la base vers le type WLangage qui peuvent entraîner arrondis ou des formatages inattendus (par exemple une Date transformée en chaîne).
    Il est donc conseillé de spécifier de façon adéquate les types WLangage des variables avant d'exécuter la requête. Ceci est peut être fait :
    • soit en initialisant la valeur de la variables (types simples : entier, chaîne, flottant)
    • soit en spécifiant le type attendu grâce à la propriété ..Type (non supporté dans cette version)
  3. Exécuter la requête à l'aide de la fonction HExécuteRequêteSQL.

Remarques

  • La fonction HExécuteRequêteSQL doit être utilisée avec :
    • le nom de la connexion,
    • la constante hRequêteSansCorrection.
  • Les variables déclarées doivent être identiques à celles utilisées. Dans le cas contraire, une erreur WLangage est affichée.
  • Dans l'appel à la procédure stockée, il est nécessaire d'utiliser la syntaxe spécifique à la base de données utilisée, y compris pour la syntaxe des paramètres. Ainsi, pour Oracle, les paramètres sont spécifiés avec la syntaxe :NomParam. Attention : le caractère ":" doit être suivi d'au moins une lettre (la syntaxe :1 est interdite).
    Il est possible d'utiliser plusieurs fois le même paramètre. Dans ce cas, la variable correspondante sera ré-utilisée.
  • Pour exécuter une requête sans que le bind ne soit activé, utiliser la constante hSansBind dans la fonction HExécuteRequêteSQL.
Exemple
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.
  • 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.
Versions 18 et supérieures
Fonctions et procédures renvoyant un curseur

Principe

Si la requête ne renvoie pas de 'resultset', mais si l'un de ses paramètres est un curseur (la valeur de retour est traitée comme un paramètre OUT), alors le curseur est parcouru comme si c'était le résultat de le requête.
Remarques :
  • La fonction HPrépareRequêteSQL ne permet pas d'initialiser le parcours du curseur. Il faut appeler directement la fonction HExécuteRequêteSQL.
  • Le nom du paramètre de type curseur ou de la valeur de retour de type curseur doit être postfixé par "%CURSOR" pour que le Connecteur Natif effectue un bind d'un paramètre de type curseur.

Exemple : Fonction renvoyant un curseur

  • Création de la table source des données :
    CREATE TABLE frm_user(user_nom      VARCHAR2(20));
    INSERT INTO frm_user VALUES ('toto');
    INSERT INTO frm_user VALUES ('titi');
    INSERT INTO frm_user VALUES ('tutu');
    COMMIT;
  • Fonction renvoyant un curseur :
    return sys_refcursor
    as

    vRefCursor SYS_REFCURSOR;
    begin
    OPEN vRefCursor FOR
    SELECT user_nom
    FROM frm_user;

    RETURN vRefCursor;
    end;
  • Code WLangage permettant d'exécuter la fonction et de parcourir le résultat :
    maProcedure est une Source de Données
    SI PAS HExécuteRequêteSQL(maProcedure, connexionOracle, hRequêteSansCorrection, ...
    "begin :return_value%CURSOR := affiche_user(); end;") ALORS
    Erreur("Erreur sur HExécuteRequêteSQL", "", HErreurInfo(hErrComplet))
    RETOUR
    SINON
    POUR TOUT maProcedure
    Trace(HRécupèreEnregistrement(maProcedure))
    FIN
    FIN

    La trace contient :
    toto
    titi
    tutu

Exemple : Procédure avec un paramètre de type curseur

  • Création de la table source des données :
    CREATE TABLE frm_user(user_nom VARCHAR2(20));
    INSERT INTO frm_user VALUES ('toto');
    INSERT INTO frm_user VALUES ('titi');
    INSERT INTO frm_user VALUES ('tutu');
    COMMIT;
  • Procédure avec un paramètre de type curseur :
    (O_RESULT_SET OUT SYS_REFCURSOR)
     AS
     BEGIN
       OPEN O_RESULT_SET FOR
       SELECT user_nom
       FROM frm_user;
     END;
  • Code WLangage permettant d'exécuter la procédure et de parcourir le résultat :
    maProcedure est une Source de Données
    SI PAS HExécuteRequêteSQL(maProcedure, connexionOracle, hRequêteSansCorrection, ...
    "begin Proc_affiche_user(:return_value%CURSOR); end;") ALORS
    Erreur("Erreur sur HExécuteRequêteSQL", "", HErreurInfo(hErrComplet))
    RETOUR
    SINON
    POUR TOUT maProcedure
    Trace(HRécupèreEnregistrement(maProcedure))
    FIN
    FIN

    La trace contient :
    toto
    titi
    tutu
Nouveauté 18
Fonctions et procédures renvoyant un curseur

Principe

Si la requête ne renvoie pas de 'resultset', mais si l'un de ses paramètres est un curseur (la valeur de retour est traitée comme un paramètre OUT), alors le curseur est parcouru comme si c'était le résultat de le requête.
Remarques :
  • La fonction HPrépareRequêteSQL ne permet pas d'initialiser le parcours du curseur. Il faut appeler directement la fonction HExécuteRequêteSQL.
  • Le nom du paramètre de type curseur ou de la valeur de retour de type curseur doit être postfixé par "%CURSOR" pour que le Connecteur Natif effectue un bind d'un paramètre de type curseur.

Exemple : Fonction renvoyant un curseur

  • Création de la table source des données :
    CREATE TABLE frm_user(user_nom      VARCHAR2(20));
    INSERT INTO frm_user VALUES ('toto');
    INSERT INTO frm_user VALUES ('titi');
    INSERT INTO frm_user VALUES ('tutu');
    COMMIT;
  • Fonction renvoyant un curseur :
    return sys_refcursor
    as

    vRefCursor SYS_REFCURSOR;
    begin
    OPEN vRefCursor FOR
    SELECT user_nom
    FROM frm_user;

    RETURN vRefCursor;
    end;
  • Code WLangage permettant d'exécuter la fonction et de parcourir le résultat :
    maProcedure est une Source de Données
    SI PAS HExécuteRequêteSQL(maProcedure, connexionOracle, hRequêteSansCorrection, ...
    "begin :return_value%CURSOR := affiche_user(); end;") ALORS
    Erreur("Erreur sur HExécuteRequêteSQL", "", HErreurInfo(hErrComplet))
    RETOUR
    SINON
    POUR TOUT maProcedure
    Trace(HRécupèreEnregistrement(maProcedure))
    FIN
    FIN

    La trace contient :
    toto
    titi
    tutu

Exemple : Procédure avec un paramètre de type curseur

  • Création de la table source des données :
    CREATE TABLE frm_user(user_nom VARCHAR2(20));
    INSERT INTO frm_user VALUES ('toto');
    INSERT INTO frm_user VALUES ('titi');
    INSERT INTO frm_user VALUES ('tutu');
    COMMIT;
  • Procédure avec un paramètre de type curseur :
    (O_RESULT_SET OUT SYS_REFCURSOR)
     AS
     BEGIN
       OPEN O_RESULT_SET FOR
       SELECT user_nom
       FROM frm_user;
     END;
  • Code WLangage permettant d'exécuter la procédure et de parcourir le résultat :
    maProcedure est une Source de Données
    SI PAS HExécuteRequêteSQL(maProcedure, connexionOracle, hRequêteSansCorrection, ...
    "begin Proc_affiche_user(:return_value%CURSOR); end;") ALORS
    Erreur("Erreur sur HExécuteRequêteSQL", "", HErreurInfo(hErrComplet))
    RETOUR
    SINON
    POUR TOUT maProcedure
    Trace(HRécupèreEnregistrement(maProcedure))
    FIN
    FIN

    La trace contient :
    toto
    titi
    tutu
Fonctions et procédures renvoyant un curseur

Principe

Si la requête ne renvoie pas de 'resultset', mais si l'un de ses paramètres est un curseur (la valeur de retour est traitée comme un paramètre OUT), alors le curseur est parcouru comme si c'était le résultat de le requête.
Remarques :
  • La fonction HPrépareRequêteSQL ne permet pas d'initialiser le parcours du curseur. Il faut appeler directement la fonction HExécuteRequêteSQL.
  • Le nom du paramètre de type curseur ou de la valeur de retour de type curseur doit être postfixé par "%CURSOR" pour que le Connecteur Natif effectue un bind d'un paramètre de type curseur.

Exemple : Fonction renvoyant un curseur

  • Création de la table source des données :
    CREATE TABLE frm_user(user_nom      VARCHAR2(20));
    INSERT INTO frm_user VALUES ('toto');
    INSERT INTO frm_user VALUES ('titi');
    INSERT INTO frm_user VALUES ('tutu');
    COMMIT;
  • Fonction renvoyant un curseur :
    return sys_refcursor
    as

    vRefCursor SYS_REFCURSOR;
    begin
    OPEN vRefCursor FOR
    SELECT user_nom
    FROM frm_user;

    RETURN vRefCursor;
    end;
  • Code WLangage permettant d'exécuter la fonction et de parcourir le résultat :
    maProcedure est une Source de Données
    SI PAS HExécuteRequêteSQL(maProcedure, connexionOracle, hRequêteSansCorrection, ...
    "begin :return_value%CURSOR := affiche_user(); end;") ALORS
    Erreur("Erreur sur HExécuteRequêteSQL", "", HErreurInfo(hErrComplet))
    RETOUR
    SINON
    POUR TOUT maProcedure
    Trace(HRécupèreEnregistrement(maProcedure))
    FIN
    FIN

    La trace contient :
    toto
    titi
    tutu

Exemple : Procédure avec un paramètre de type curseur

  • Création de la table source des données :
    CREATE TABLE frm_user(user_nom VARCHAR2(20));
    INSERT INTO frm_user VALUES ('toto');
    INSERT INTO frm_user VALUES ('titi');
    INSERT INTO frm_user VALUES ('tutu');
    COMMIT;
  • Procédure avec un paramètre de type curseur :
    (O_RESULT_SET OUT SYS_REFCURSOR)
     AS
     BEGIN
       OPEN O_RESULT_SET FOR
       SELECT user_nom
       FROM frm_user;
     END;
  • Code WLangage permettant d'exécuter la procédure et de parcourir le résultat :
    maProcedure est une Source de Données
    SI PAS HExécuteRequêteSQL(maProcedure, connexionOracle, hRequêteSansCorrection, ...
    "begin Proc_affiche_user(:return_value%CURSOR); end;") ALORS
    Erreur("Erreur sur HExécuteRequêteSQL", "", HErreurInfo(hErrComplet))
    RETOUR
    SINON
    POUR TOUT maProcedure
    Trace(HRécupèreEnregistrement(maProcedure))
    FIN
    FIN

    La trace contient :
    toto
    titi
    tutu
Version minimum requise
  • Version 9
Documentation également disponible pour…
Commentaires
Cliquez sur [Ajouter] pour publier un commentaire