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 : Sélectionner tout - Visualiser dans une fenêtre à part
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;
Partager