PB à toute heure et à tout moment. (à parcourir avec modération)

Le forum (ô combien francophone) des utilisateurs de Powerbuilder.

Recherche rapide

Annonce

Certaines rubriques, dont des cours, sont uniquement visibles par les membres du forum ^^.
Dans la rubrique Liens & Références, vous avez accès à un sommaire de téléchargement, profitez-en !
Il existe maintenant un nouveau TOPIC "Votre CV en Ligne" accessible uniquement par demande.

#1 24-08-2006 12:05:29

pick ouic  
La bourse ou la vie ^^
Award: gearotter
Lieu: Massy-Verrières
Date d'inscription: 29-05-2006
Messages: 4658
Pépites: 942
Banque: 2,147,483,647
Site web

[DOC] Utilisation des curseurs sous 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:

Code: pb

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:

Code: pb

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:

Code: pb

// 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:

Code: pb

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:

Code: pb

// 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:

Code: pb

// 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 :

Code: pb

// 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

Connaitre son ignorance est une grande part de la connaissance.
http://animegifs.free.fr/anime/mazinger/mazinger.gif

Hors ligne

 

#2 22-10-2007 08:21:56

JCZ  
Builder Power
Award: bf
Lieu: 75019 paris
Date d'inscription: 21-05-2007
Messages: 1724
Pépites: 496,453,703,213
Banque: 9,223,372,036,854,776,000

Re: [DOC] Utilisation des curseurs sous Powerbuilder

Il est possible aussi d'avoir des curseurs dynamiques
Exemple

Code: pb

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

Code: pb

DynamicStagingArea SQLSA_sql
SQLSA_sql = CREATE DynamicStagingArea
DECLARE c_cursor DYNAMIC CURSOR FOR SQLSA_sql;
...

Face à l'agression, la puissance de l'intelligence

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB 1.2.22