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






Bonjour à tous,
Lors de l'exécution d'un curseur, j'ai le message suivant :
(Mismatch between retrieve columns and fetch columns)
A titre indicatif : j'ai mis la déclaration (DECLARE), l'ouverture du curseur (OPEN) et la fermeture (CLOSE) à l'extérieur de la boucle FOR, mais le (FETCH) à l'intérieur.
En fait, je voulais boucler sur les n lignes retrouvées pas le curseur.
J'ai trouvé ça sur le net mais, j'ai rien compris :
http://www.experts-exchange.com/Program … 34088.html
Quelqu'un a une idée.
Merci d'avance !
Dernière modification par mattdamon (14-06-2010 16:04:15)
Hors ligne











Bonjour Matt,
Je pense qu'il va être difficile de se faire une idée
sans voir ton code.
A priori, le message indique que tu n'as pas mis dans le FETCH toutes les colonnes
récupérées de ton curseur, ou que les variables de FETCH sont d'un type
différent des colonnes de ton curseur.
Hors ligne






Bonjour foon,
Je crois pas que c'est un problème de nombre des colonnes ou de type.
voici le code :
DECLARE cursor CURSOR FOR SELECT t1.col1, t1.col2, t2.col FROM tab1 t1, tab2 t2 WHERE t1.col3 = :as_port AND t1.col1 = t2.col; //l'ouverture du curseur OPEN cursor ; SELECT count (t1.col1) INTO :li_nb_col1 FROM tab1 t1 where t1.col3 = :as_port; // FOR li_cpt = 1 TO li_nb_col1 FETCH cursor INTO :ls_col1,:li_col2, :ls_col; //le traitement NEXT CLOSE cursor;
ls_col1 et ls_col sont string dans le code PB, VARCHAR2(16) et VARCHAR2(30) dans la table.
li_col2 : Integer dans le code PB et NUMBER(5) dans la table.
Hors ligne














juste pour info, tu n'as pas besoin du nb d'enregistrements pour boucler sur un curseur, tu peux utiliser sqlca.sqlcode :
OPEN emp_curs; // Fetch the first row from the result set. FETCH emp_curs INTO :emp_name_var; // Loop through result set until exhausted. DO WHILE SQLCA.sqlcode = 0 // Display a message box with the employee name. MessageBox("Found an employee!",emp_name_var) // Fetch the next row from the result set. FETCH emp_curs INTO :emp_name_var; LOOP // All done, so close the cursor. CLOSE emp_curs;
Hors ligne








Ok avec erasorz, d'ailleurs son code est plus sûr.
Rien ne garantit que li_nb_col1 contienne le nombre de ligne de ton curseur.
D'autre part, les integer PB sont sur 2 octets.
Utilise long ou dec{0}.
Hors ligne











shahin a écrit:
D'autre part, les integer PB sont sur 2 octets.
Utilise long ou dec{0}.
Rien de plus à ajouter
Hors ligne






Bonjour,
Ta requête possède un paramètre d'entrée que tu n'initialises jamais. Dans ton cas, Tu dois utiliser la syntaxe Sybase dite : Dynamic SQL Format 3 SQL statement
lorsque ta requête possède un paramètre d'entrée et produit un "result set".
Tu as tous les détails dans l'aide en ligne avec des exemples en recherchant sur la rubrique : Dynamic SQL Format 3 SQL statement.
Hors ligne






buck a écrit:
Bonjour,
Ta requête possède un paramètre d'entrée que tu n'initialises jamais. Dans ton cas, Tu dois utiliser la syntaxe Sybase dite : Dynamic SQL Format 3 SQL statement
lorsque ta requête possède un paramètre d'entrée et produit un "result set".
Tu as tous les détails dans l'aide en ligne avec des exemples en recherchant sur la rubrique : Dynamic SQL Format 3 SQL statement.
Merci à tous pour votre intervention, si j'ai bien compris ta réponse, je dois changer mon curseur en curseur dynamique c-à-d dois-je mettre ma mon select dans une chaine de caractère en suite j'exécute mon curseur.
A+
Hors ligne






Oui.
As-tu une raison particulière d'utiliser un curseur ? une datastore avec un retrievial arguments me paraît bien plus adaptée pour ton problème.
Hors ligne














buck a écrit:
As-tu une raison particulière d'utiliser un curseur ? une datastore avec un retrievial arguments me paraît bien plus adaptée pour ton problème.
ne jamais perdre de l'esprit que les DW/DS sont l'essence même de PB.
Il faut utiliser leur potentiel par défaut.
Sauf pour les qq (rares) cas où il faut utiliser autre-chose (curseur, SQL embarqué, dynamique,...)
Hors ligne






buck a écrit:
Oui.
As-tu une raison particulière d'utiliser un curseur ? une datastore avec un retrievial arguments me paraît bien plus adaptée pour ton problème.
J'ai modifié la bariable li_col2 de Integer à Long et j'ai utilisé un curseur dynamique mais j'ai toujours le même message.
Bizarre!!!!
Dans mon cas, je dois utiliser un curseur
Hors ligne






Je l'ai trouvé, en fait, j'ai mis la CLOSE du curseur dans une IF et le OPEN à l'extérieur de IF ==> donc un emssage d'erreur.
Pour la corriger, j'ai fermé le curseur à l'extérieur de IF.
Merci à tous !
Je vais mettre la discussion à RESOLU .
Hors ligne










mattdamon a écrit:
Je l'ai trouvé, en fait, j'ai mis la CLOSE du curseur dans une IF et le OPEN à l'extérieur de IF ==> donc un emssage d'erreur.
Pour la corriger, j'ai fermé le curseur à l'extérieur de IF.
Merci à tous !
Je vais mettre la discussion à RESOLU .
D'où l'importance de poste le code utilisé si tu veux que l'aide soit optimale ... !!!
Hors ligne