Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Utilisation des curseurs.
Pouvoir utiliser dans l’application frontale, les données renvoyées par une extraction effectuée au niveau du moteur SQL se fait par l’utilisation d’un curseur, concrétisation en mémoire locale des lignes renvoyées (result set).
Pour pouvoir utiliser un curseur, il est nécessaire de travailler en plusieurs étapes successives.
1°/ Déclarer le curseur et lui associer une instruction d’extraction Select
2°/ Ouvrir le curseur
3°/ Procéder à l’exploitation des données du curseur, comme il s’agit d’une vue tabulaire, cette exploitation se fait séquentiellement par un ordre de lecture séquentielle. En toute logique, il faudra tester la « fin de vue tabulaire »
4°/ Fermer le curseur après utilisation.
1°/ Déclarer le curseur
Une instruction de déclaration permet de définir un curseur
Syntaxe :
DECLARE CursorName CURSOR FOR InstructionSelect {USING TransactionObject} ;
Exemple:
DECLARE emp_cur Cursor FOR SELECT employee.emp_number, employee.emp_name FROM employee WHERE employee.emp_salary > 10000 ;
2°/ Ouvrir le curseur
Utilisation d’une instruction d’ouverture de curseur
Syntaxe:
Open CursorName ;
Exemple:
OPEN emp_cursor ;
3°/ Procéder à l’exploitation
Utilisation de l’ordre SQL de lecture séquentiel dans un curseur : Fetch
Syntaxe:
FETCH Cursor/Procedure INTO HostVariableList
Exemple:
// Declaration des variables de récupération de la lecture int emp_nbr string emp_name // Instruction de lecture FETCH emp_cursor INTO :emp_nbr, :emp_name ;
4°/ Fermer le curseur.
Syntaxe:
CLOSE CursorName ;
Exemple:
CLOSE emp_cursor ;
Remarque:
Lors de l’utilisation d’un curseur, il faut contrôler la « fin de curseur ».
Pour cela, il est nécessaire d’utiliser les valeurs retournées via l’objet transaction.
Exemple de mise en oeuvre:
// Déclaration des variables de récupération. string emp_name_var // Declare le curseur DECLARE emp_curs CURSOR FOR SELECT emp_name FROM EMPLOYEE WHERE emp_state = :sle_1.text; // Exécute le SELECT OPEN emp_curs; // lecture de la première ligne FETCH emp_curs INTO :emp_name_var; // Boucle de déroulement DO WHILE SQLCA.SQLCode = 0 // Affiche une boite de message MessageBox("Employé trouvé!",emp_name_var) // Lecture suivante FETCH emp_curs INTO :emp_name_var; LOOP // Déroulement terminé, fermeture du curseur. CLOSE emp_curs;
Attention:
Dans cet exemple, la logique d’exploitation du curseur suppose que l’instruction d’extraction renvoie au moins une ligne, si ce n’est pas le cas, l’algorithme sera légèrement différent.
Utilisation de variables dans la requête.
1°/ Passage de paramètres.
La requête peut avoir besoin d’une ou plusieurs informations pour effectuer une restriction where sur la table d’extraction. Cette notion correspond au « retrieval argument » d’un query.
Exemple:
// Déclare le curseur DECLARE emp_curs CURSOR FOR SELECT emp_name FROM EMPLOYEE WHERE emp_state = :sle_1.text;
2°/ Récupération des informations lues par Fetch.
Il est nécessaire de déclarer autant de variables différenciées que de colonnes extraites et de les mentionner au niveau de l’ordre de lecture Fetch.
Exemple :
// Déclaration des variables de récupération. string emp_name_var ................................................. // Boucle de déroulement DO WHILE SQLCA.SQLCode = 0 ............................................... // Lecture FETCH emp_curs INTO :emp_name_var; LOOP
Hors ligne
Il est possible aussi d'avoir des curseurs dynamiques
Exemple
Long ll_sqlca String ls_sql, ls_COLONNE ls_sql = 'SELECT COLONNE FROM TABLE WHERE ID > 3200' DECLARE c_cursor DYNAMIC CURSOR FOR SQLSA; PREPARE SQLSA FROM :ls_sql; OPEN DYNAMIC c_cursor; FETCH c_cursor INTO :ls_COLONNE; ll_sqlca = SQLCA.SQLCODE Do While ll_sqlca = 0 // // // FETCH c_cursor INTO :ls_COLONNE; ll_sqlca = SQLCA.SQLCODE LOOP CLOSE c_cursor ;
On peut aussi creer son sqlsa
DynamicStagingArea SQLSA_sql SQLSA_sql = CREATE DynamicStagingArea DECLARE c_cursor DYNAMIC CURSOR FOR SQLSA_sql; ...
Hors ligne