Ik zit met het volgende probleem. Om bepaalde data uit de db te halen moet ik gebruik maken van twee cursors. Deze gaan door de datasets heen en halen de goede dat op. Dit gaat ook goed, maar ik wil gebruik maken van een REF CURSOR in plaats van een normale. Dit omdat ik de results door wil geven naar het bovenliggende programma. Ik krijg alleen de cursor niet een in REF CURSOR. Iemand enig idee hoe dit gedaan kan worden.
Hieronder heb ik het volledige script staan:
Bij het laatste stuk gaat het mis kijk hier onder
Hieronder heb ik het volledige script staan:
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
59
60
61
62
63
| SET SERVEROUTPUT ON
DECLARE
type MyRefCur is REF CURSOR;
nCountryId number;
nDepartmentId number;
CheckCount number;
nPageId number;
MessageCur MyRefCur;
CURSOR C1 IS
SELECT DISTINCT COUNTRYDEPARTMENTCATEGORY.DEPARTMENTID
FROM COUNTRY , COUNTRYDEPARTMENTCATEGORY
WHERE ((COUNTRY.COUNTRYID = COUNTRYDEPARTMENTCATEGORY.COUNTRYID) AND
(COUNTRY.COUNTRYID = nCountryId));
/* */
CURSOR C2 IS
SELECT Message.*
FROM MESSAGE , COUNTRYDEPARTMENTPAGE
WHERE MESSAGE.PAGEID = COUNTRYDEPARTMENTPAGE.PAGEID
AND COUNTRYDEPARTMENTPAGE.DEPARTMENTID = nDepartmentId
AND MESSAGE.MESSAGEID NOT IN (SELECT REACTION.REACTIONID FROM REACTION)
AND ROWNUM <= 1;
BEGIN
nPageId := 1;
/*SELECT IF A PAGEID IS FOR A COUNTRY OR FOR A DEPARTMENT
* 0 = FOR A DEPARMENT. 1 = FOR A COUNTRY*/
SELECT COUNT(*) INTO CheckCount
FROM PAGE , COUNTRY
WHERE PAGE.PAGEID = COUNTRY.PAGEID
AND PAGE.PAGEID = nPageId ;
/*IF CheckCount = 0 THEN THE PAGE IS A DEPARTMENTPAGE*/
IF (CheckCount = 0) THEN
OPEN MessageCur FOR
/*CODE FOR DEPARMENT MESSAGES, SELECTS THE LAST 6 MESSAGES FOR A SPECIFIC DEPARTMENT*/
SELECT * FROM
(SELECT MESSAGE.MESSAGEID, MESSAGE.MESSAGETITLE, MESSAGE.DESCRIPTION,
MESSAGE.DATE_TIME
FROM MESSAGE
WHERE (MESSAGE.PAGEID = nPageId)
AND (MESSAGE.MESSAGEID NOT IN (SELECT REACTION.REACTIONID FROM REACTION))
ORDER BY DATE_TIME)
WHERE ROWNUM <= 6
ORDER BY DATE_TIME DESC;
ELSE
/*CODE FOR COUNTRY MESSAGES*/
SELECT COUNTRY.COUNTRYID INTO nCountryId
FROM COUNTRY , PAGE
WHERE PAGE.PAGEID = COUNTRY.PAGEID AND
PAGE.PAGEID = 1;
/*LOOP THROUGH THE DEPARTMENTS FOR A SPECIFIC COUNTRY*/
FOR TEST IN C1 LOOP
nDepartmentId := TEST.DEPARTMENTID;
dbms_output.put_line(TEST.DEPARTMENTID);
/*GET THE MESSAGE FOR A DEPARTMENT*/
OPEN C2;
/*LOAD IT INTO A REF CURSOR */
OPEN MESSAGECUR FOR := SELECT C2.* FROM C2;
CLOSE C2;
END LOOP;
END IF;
END; |
Bij het laatste stuk gaat het mis kijk hier onder
code:
1
2
3
4
5
6
7
8
9
10
| /*LOOP THROUGH THE DEPARTMENTS FOR A SPECIFIC COUNTRY*/
FOR TEST IN C1 LOOP
nDepartmentId := TEST.DEPARTMENTID;
dbms_output.put_line(TEST.DEPARTMENTID);
/*GET THE MESSAGE FOR A DEPARTMENT*/
OPEN C2;
/*LOAD IT INTO A REF CURSOR */
OPEN MESSAGECUR FOR := SELECT C2.* FROM C2;
CLOSE C2;
END LOOP; |