PL/SQL - Cuseur / Persistance des données
Bonjour,
J'ai réalisé une procédure stockée qui récupère tous les enregistrements d'une table (faible volume) et qui les injecte dans un curseur.
Ensuite, pour chaque élément du curseur, je dois faire une autre requête qui vérifie si l'enregistrement est en cours est utilisé. Si l'élément n'est pas utilisé, alors il doit être ajouté au résultat retour.
La procédure stockée renvoie plusieurs enregistrements. Pour cela, j'ai créé une structure adaptée de type :
Code:
1 2
|
type ncDiagQuId_table_type is table of NC_DIAG_QU.NCDIAGQUID%TYPE index by binary_integer; |
J'ai déboggé la procédure stockée et mis des traces. Le fetch sur les éléments du curseur est ok. La requête qui vérifie si l'élément en cours est utilisé fonctionne. Les traces envoient un résultat correct.
Par contre, lorsque j'appelle cette procédure stockée depuis mon programme, le résultat semble aléatoire. Est-ce lié au fait que le résultat du curseur est stocké dans des variables intermédiares ?
J'espère avoir été assez clair et par avance merci de votre aide.
Ci-dessous la procédure stockée qui me fait perdre des cheveux (je n'en ai déjà plus bcp :P):
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 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
|
type ncDiagQuId_table_type is table of NC_DIAG_QU.NCDIAGQUID%TYPE
index by binary_integer;
type ncQuestionCode_table_type is table of NC_DIAG_QU.NCQUESTIONCODE%TYPE
index by binary_integer;
type ncShortQuestion_table_type is table of NC_DIAG_QU.NCSHORTQUESTION%TYPE
index by binary_integer;
type swDateCreated_table_type is table of VARCHAR2(10)
index by binary_integer;
type ncDiagCodeId_table_type is table of NC_DIAG_CODE.NCDIAGCODEID%TYPE
index by binary_integer;
type ncDiagCode_table_type is table of NC_DIAG_CODE.NCDIAGCODE%TYPE
index by binary_integer;
type ncMotif_table_type is table of NC_MOTIF.NCMOTIF%TYPE
index by binary_integer;
type ncSousMotif_table_type is table of NC_MOTIF.NCSOUSMOTIF%TYPE
index by binary_integer;
type ncActionType_table_type is table of NC_ACTION_TYPE.NCACTIONTYPE%TYPE
index by binary_integer;
PROCEDURE NCSP_DIAG_CODE_NON_USED
(
o_ncDiagCode OUT ncDiagCode_table_type,
o_ncMotif OUT ncMotif_table_type,
o_ncSousMotif OUT ncSousMotif_table_type,
o_ncActionType OUT ncActionType_table_type,
o_swDateCreated OUT swDateCreated_table_type,
o_ncDiagCodeId OUT ncDiagCodeId_table_type,
batch_size IN int,
out_batch_size IN OUT int,
status OUT int
) IS
i binary_integer;
j binary_integer;
n binary_integer;
f_ncDiagCode NC_DIAG_CODE.NCDIAGCODE%TYPE;
f_ncMotif NC_MOTIF.NCMOTIF%TYPE;
f_ncSousMotif NC_MOTIF.NCSOUSMOTIF%TYPE;
f_ncActionType NC_ACTION_TYPE.NCACTIONTYPE%TYPE;
f_swDateCreated VARCHAR2(10);
f_ncDiagCodeId NC_DIAG_CODE.NCDIAGCODEID%TYPE;
BEGIN
out_batch_size := 0;
status := 0;
j := 1;
IF not curDiagCode%ISOPEN THEN
open curDiagCode;
END IF;
for i in 1..batch_size
LOOP
/*fetch curDiagCode INTO o_ncDiagCode(i),
o_ncMotif(i),
o_ncSousMotif(i),
o_ncActionType(i),
o_swDateCreated(i),
o_ncDiagCodeId(i);*/
fetch curDiagCode INTO f_ncDiagCode,
f_ncMotif,
f_ncSousMotif,
f_ncActionType,
f_swDateCreated,
f_ncDiagCodeId;
IF curDiagCode%NOTFOUND THEN
close curDiagCode;
exit;
ELSE
SELECT count(q.ncDiagQuId) into n
FROM NC_DIAG_QU q
WHERE q.ncDiagCodeId1 = f_ncDiagCodeId
OR q.ncDiagCodeId2 = f_ncDiagCodeId
OR q.ncDiagCodeId3 = f_ncDiagCodeId
OR q.ncDiagCodeId4 = f_ncDiagCodeId
OR q.ncDiagCodeId5 = f_ncDiagCodeId
OR q.ncDiagCodeId6 = f_ncDiagCodeId
OR q.ncDiagCodeId7 = f_ncDiagCodeId
OR q.ncDiagCodeId8 = f_ncDiagCodeId
OR q.ncDiagCodeId9 = f_ncDiagCodeId
OR q.ncDiagCodeId10 = f_ncDiagCodeId;
if n = 0 then
o_ncDiagCode(j):= f_ncDiagCode;
o_ncMotif(j):=f_ncMotif;
o_ncSousMotif(j):=f_ncSousMotif;
o_ncActionType(j):=f_ncActionType;
o_swDateCreated(j):=f_swDateCreated;
o_ncDiagCodeId(j):=f_ncDiagCodeId;
out_batch_size := out_batch_size+1;
j:= j+1;
end if;
end if;
END LOOP;
END NCSP_DIAG_CODE_NON_USED; |
A+