[PL/SQL] Traitement d'un curseur dans une fonction
Salut,
je dois exécuter une requete SQL dans une fonction (ce qui me retournera un curseur) et boucler sur le curseur retourné pour créer une nouvelle requete SQL. J'ai essayé pas mal de truc mais y a toujours un probleme.
Voici où j'en suis :
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 46 47 48 49 50 51 52 53 54 55 56 57 58
|
FUNCTION fc_getarbreconsultable (pi_prefixe IN re_region.re_prefixe%TYPE)
RETURN ref_cursor
AS
cur_rubrique ref_cursor; -- curseur pour retourner les rubriques
nbrubcons NUMBER;
i NUMBER:=0;
nbrows NUMBER;
req VARCHAR2 (500); -- variable pour construction de la requete
CURSOR cur_rubcons IS SELECT ru.ru_id, ru.ru_idpere, ru.ru_libelle, ru.ru_niveau, ru.ru_lien, ru.ru_type, ru.ru_magasin, ru.ru_bg, ru.ru_bd
FROM ru_rubrique ru, dr_droit dr, re_region re
WHERE dr.ru_id = ru.ru_id
AND ru.ru_id = '2'
AND re.re_prefixe = pi_prefixe
AND dr.re_id = re.re_id
--AND ru_consultable = '1'
ORDER BY ru_bg ASC;
rubrique ref_cursor;
BEGIN
req := 'SELECT ru.ru_id, ru.ru_idpere, ru.ru_libelle, ru.ru_niveau, ru.ru_lien, ru.ru_type, ru.ru_magasin ';
req := req || 'FROM ru_rubrique ru, dr_droit dr, re_region re ';
req := req || 'WHERE ru.ru_id = dr.ru_id AND re.re_prefixe = ''' || pi_prefixe || ''' AND dr.re_id = re.re_id AND (';
--nbrubcons := cur_rubcons%ROWCOUNT;
-- boucle sur toutes les rubriques consultables
--WHILE cur_rubcons IS NOT NULL
FOR rubrique IN cur_rubcons
--Open cur_rubcons ; -- ouverture du curseur
LOOP
--fetch cur_rubcons into rubrique;
--exit when rubrique%notfound;
i := i+1;
req := req || '(ru.ru_bg <= ' || rubrique.ru_bg || ' AND ru.ru_bd >= ' || rubrique.ru_bd || ')';
IF i < nbrubcons THEN
req := req || ' OR ';
END IF;
-- si il s'agit de la derniere rubrique, on n'ajoute pas le OR
/*IF (rubrique IS NOT NULL) THEN
req := req || ' OR ';
END IF;*/
END LOOP;
--CLOSE cur_rubcons ;
req := req || ') ORDER BY ru.ru_bg ASC';
OPEN cur_rubrique
FOR req;
RETURN cur_rubrique;
END fc_getarbreconsultable; |
alors plusieurs choses :
- si j'essaie de faire un nbrubcons := cur_rubcons%ROWCOUNT; ça plante. Comment je peux connaitre le nombre de lignes du resultat de la premiere requete SQL ?
- je n'arrive pas à utiliser fetch cur_rubcons into rubrique; avec un message d'erreur disant qu'il ne peut pas mettre la valeur courante du curseur dans la variable rubrique.
- si j'essaie de faire IF (rubrique IS NOT NULL) j'ai une erreur disant que IS NOT NULL ne peut s'appliquer sur rubrique. Comment je peux connaitre le dernier enregistrement du curseur ?
- est ce que cette méthode est correcte pour faire ce que j'ai à faire ou y a t il une meilleure façon de procéder ?
Bon ça fait deja pas mal de question ! désolé je débute en PL/SQL (et j'ai l'impression que je commence pas par le plus facile... :lol: )
Merci d'avance
Thomas