Bonjour,
Je dois rédiger une procédure stockée qui, en fontion des paramètres reçus, lancera la requête adéquate. Ma procédure doit envoyer par la suite un curseur sur le résultat.
Comment faire ? Merci
Version imprimable
Bonjour,
Je dois rédiger une procédure stockée qui, en fontion des paramètres reçus, lancera la requête adéquate. Ma procédure doit envoyer par la suite un curseur sur le résultat.
Comment faire ? Merci
Voilà un exemple structurant le passage de paramètre dans une procédure, et l'utilisation de curseur en fonction de la valeur des paramètres.
A toi de l'adapter à tes besoins, et aussi de consulter la doc...
Bon courageCode:
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 CREATE OR REPLACE PROCEDURE Ma_procedure ( Param_1 IN NUMBER, Param_2 IN VARCHAR ) IS CURSOR C1 IS SELECT ...... var_1 NUMBER(5); var_2 VARCHAR2(100); BEGIN IF Param_1 = 1 AND Param_2 = 'A' THEN OPEN C1; LOOP FETCH C1 INTO var_1, var_2; EXIT WHEN C1%NOTFOUND; Traitement... END LOOP; CLOSE C1; ELSIF Param_1 = 2 AND Param_2 = 'B' THEN ...................... ELSIF Param_1 = 3 AND Param_2 = 'C' THEN ...................... END IF; END; /
Merci pour votre réponse!
J'ai fais ma procédure stockée qui en fait effectue une requête SQL et qui me renvoie un curseur. Ca compile!
Mais comment faire pour tester cette procédure à partir deToad et vérifier que tout fonctionne ?
Dans TOAD, sélectionner tout, puis exécuter :
Tu peux passer des valeurs en dur à la place de valeur_1 et valeur_2 pour tester.Code:
1
2
3
4
5 BEGIN Ma_Procedure (valeur_1, valeur_2); END; /
Je fais ça pour tester :
J'ai une erreur qui se génère et je ne sais pas pourquoi.Code:
1
2
3
4
5 BEGIN PKG_ECH.ECH_SEARCH(1,null,null,:cursor); END; /
Voici ce que je fais dans ma procédure:
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 PROCEDURE ECH_SEARCH ( inNUMINT in ECHEAN.NUMINT%TYPE, inIDEOPE in CARTOU.IDEOPE%TYPE, inCODTERLO in CARTOU.CODTERLO%TYPE, outREF_CURSOR_ECH out refcur ) IS requete varchar2(255); numoperation varchar2(10); codeTerritoire varchar2(10); c1 refcur; BEGIN requete := 'SELECT * FROM ECHEAN e, CARTOU c'; numoperation := inIDEOPE; codeTerritoire := inCODTERLO; if(inNUMINT IS NOT NULL) then requete := requete ||' ' || 'WHERE e.NUMPRE = ' || inNUMINT; end if ; if(inIDEOPE IS NOT NULL) then numoperation := '''' || inIDEOPE || ''''; DBMS_OUTPUT.PUT_LINE(numoperation); if(requete = '') then requete := requete ||' ' ||'WHERE c.IDEOPE = ' || numoperation; Else requete := requete ||' ' ||'AND c.IDEOPE = ' || numoperation; end if; end if ; if(inCODTERLO IS NOT NULL) then codeTerritoire := '''' || inCODTERLO || ''''; DBMS_OUTPUT.PUT_LINE(codeTerritoire); if(requete = '') then requete := requete ||' ' ||'WHERE c.CODTERLO = ' || codeTerritoire; else requete := requete ||' ' ||'AND c.CODTERLO = ' || codeTerritoire; end if; end if ; requete := requete || ';'; DBMS_OUTPUT.PUT_LINE(requete); --EXECUTE IMMEDIATE requete USING OUT outREF_CURSOR_ECH; OPEN outREF_CURSOR_ECH FOR requete; END ECH_SEARCH;
C'est bon j'ai trouvé pourquoi j'ai un message d'erreur! Il ne faut pas ajouter un ; la fin de la requête à executer sur le curseur.
Merci pour votre aide