Précédent   Forum des professionnels en informatique > Bases de données > Sybase
Sybase Forum sur la base de données Sybase. Avant de poster -> F.A.Q Sybase, Tutoriels Sybase
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/02/2006, 11h48   #1
Invité de passage
 
Inscription : février 2006
Messages : 3
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 3
Points : 1
Points : 1
Par défaut [ASA 8] Procédure stockée et requete dynamique

Bonjour,
je cherche à faire une procedure stockee qui "construise" dynamiquement une requete SQL (possiblité de choisir les colonne et le tri) puis qui me renvoie N lignes à partir de la position M (fonction LIMIT sous MySQL). Pour faire tout cela, j'utilise un curseur.

J'y suis presque arrivé (cf. code ci-dessous) mais ma procedure stockee me renvoie les résultats triés aléatoirement alors que j'ai mis un order dans ma requete.
Je m'explique : (je fais un tri sur la col n°1)
Si N=3Lignes et M=1erePosition
Alors
1, toto, motdepasse1
3, titi, motdepasse3
2, tutu, motdepasse2

Si N=5Lignes et M=1erePosition
Alors
1, toto, motdepasse1
3, titi, motdepasse3
5, tete, motdepasse5
2, tutu, motdepasse2
4, tata, motdepasse4

Voilà, ça fait un petit moment que je bloque dessus et je commence à me demander si je vais dans la bonne direction pour résoudre mon problème ou si je me gourre.
Merci d'avance pour votre aide.
Xavier
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
 
CREATE PROCEDURE PROC(
	IN PARAMS ....)
BEGIN
	--DECLARE VARIABLES ....
	DECLARE l_err		EXCEPTION FOR SQLSTATE VALUE '02000';
 
	DECLARE LOCAL TEMPORARY TABLE l_result(COLS ...) ON COMMIT PRESERVE ROWS;
 
	SET l_query='SELECT * FROM TR_TEST WHERE ';
	IF(CONDITION) THEN
		SET l_query=l_query || '(COL1 ';
		CASE i_doc
			WHEN '' THEN SET l_query=l_query || 'LIKE ''%''';
			ELSE SET l_query=l_query || '= ' || i_param;
		END CASE;
	ELSE
		SET l_query=l_query || '(CODE_DOCS LIKE ''%' || i_num || '%''';
	END IF;
 
	CASE i_col
		WHEN 'login' THEN SET l_query=l_query || ') ORDER BY COL1 ' || i_order;
		ELSE SET l_query=l_query || ') ORDER BY COL2';
	END CASE;
 
	BEGIN
		DECLARE l_curs DYNAMIC SCROLL CURSOR USING l_query;
 
		OPEN l_curs;
			-- On positionne le pointeur du curseur la ligne n° "i_pos"
			FETCH ABSOLUTE i_pos l_curs INTO ...;
 
			SET l_cpt=0;
			-- Lecture du curseur jusqu'à i_range
			WHILE((l_cpt<i_range) AND (SQLSTATE <> l_err)) LOOP
				INSERT INTO l_result VALUES(...);
				SET l_cpt=l_cpt+1;
				FETCH NEXT l_cursDocs INTO ...;
			END LOOP;
		CLOSE l_cursDocs;
 
		SELECT * FROM l_result;
	END
 
END;
Xavier38 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2006, 13h51   #2
Rédacteur/Modérateur
 
Avatar de fadace
 
Homme Fabien Celaia
Administrateur de base de données
Inscription : octobre 2002
Messages : 3 779
Détails du profil
Informations personnelles :
Nom : Homme Fabien Celaia
Âge : 41
Localisation : Suisse

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Service public

Informations forums :
Inscription : octobre 2002
Messages : 3 779
Points : 8 124
Points : 8 124
Envoyer un message via ICQ à fadace Envoyer un message via Skype™ à fadace
Pourquoi ne pas remplacer votre curseur par un TOP ?

http://manuals.sybase.com/onlinebooks/group-sas/awg0800e/dbrfen8/@Generic__BookView;pt=557;lang=fr?DwebQuery=top
__________________
Sr DBA Oracle / Sybase / MS-SQL / DB2 / Informix / Postgresql
Administrateur SAP
Mes articles

Attention : pas de réponse technique par MP : pensez aux autres, passez par les forums !
fadace est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2006, 14h04   #3
Invité de passage
 
Inscription : février 2006
Messages : 3
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 3
Points : 1
Points : 1
Parce que je souhaite imiter le comportement du LIMIT de MySQL sans utiliser TOP
J'ai trouvé la possiblité de réaliser cette contrainte (cf http://sqlserver.developpez.com/faq/?page=Recordset#JE2). Mais je n'aime pas cette façon de faire
Xavier38 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2006, 15h20   #4
Invité de passage
 
Inscription : février 2006
Messages : 3
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 3
Points : 1
Points : 1
J'ai trouvé javascript:emoticon('')

L'erreur venais de moi (comme toujours). Je pensais que lorsque l'on stockait le résultat d'un curseur dans une table, il stocké les data dans l'ordre de lecture du curseur. Et bien, c'est faux!!!

Pour résoudre mon probleme, j'ai ajouté à ma table une colonne autoincremnet et j'ordonne ma table grace a cette colonne.
Xavier38 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h44.


 
 
 
 
Partenaires

Hébergement Web