J'essaie d'utiliser une fonction pipelined pour économiser à temps et réduire la redondance dans mes requêtes. La fonction en question renvoie des données d'une table de référence en fonction d'une entrée. Les enregistrements de la table de données principale que je sélectionne comportent plusieurs colonnes qui se réfèrent toutes à la table de référence. Le problème que je rencontre est que lorsque j'essaie d'utiliser la fonction pipelined plus d'une fois dans la requête, j'obtiens une erreur "cursor already open".PL/SQL - utilise deux fois la même fonction pipelined dans la même requête
Par exemple:
select xmlelement("genInf", xmlelement("ID", vt.ID),
xmlelement("vID", vt.V_ID),
xmlelement("vNum", vt.V_NUM),
xmlelement("terrDataCode", TERR_CODE.column_value), --data is based on reference table
xmlelement("ABValCode", AB_VAL_CD.column_value), --data is based on reference table
...
from V_TAB vt, table(UTIL.fn_getOvrdValXML(vt.terr_cd_id)) TERR_CODE,
table(UTIL.fn_getOvrdValXML(vt.ab_val_id)) AB_VAL_CD
where vt.ID = in_vID;
Cela a bien fonctionné jusqu'à ce que j'ajouté la deuxième référence à ma fonction de pipeline (fn_getOvrdValXML), et je reçois maintenant l'erreur « curseur est déjà ouvert ».
La fonction pipe-line est très simple:
type t_XMLTab is table of XMLType; --this type is in the spec
....
function fn_getOvrdValXML(in_ID in ovrd.id%type) return t_XMLTab
pipelined is
begin
for r in C_OvrdVal(in_ID) loop
pipe row(r.XMLChunk);
end loop;
return;
end;
Le curseur est de la même simple:
cursor C_OvrdVal(in_ID in ovrd.id%type) is
select xmlforest(ID as "valueID", S_VAL as "sValue", U_VAL as "uplValue",
O_VAL as "oValue", O_IND as "oIndicator", F_VAL as "finalValue",
O_RSN as "reason") AS XMLChunk
from ovrd_val xov;
where xov.id = in_ID;
est-il un moyen de contourner ce problème, ou devrais-je essayer de résoudre ce problème (la problème de devoir référencer ovrd_val et sortir une xmlforest de la même manière beaucoup de beaucoup de fois) différemment?
Je dois admettre que je suis nouveau aux fonctions canalisées je ne suis pas 100% sûr que ce soit une utilisation appropriée, mais il était logique à l'époque et je suis ouvert à d'autres idées;)
Il y a probablement une erreur dans la définition du curseur - ";" après xov – jva
@jva: le curseur fonctionne correctement lorsqu'il est testé séparément. – FrustratedWithFormsDesigner
@Frustrated: Ne valait pas la peine d'aborder le problème du curseur - vous obtenez la fonctionnalité que vous voulez sans les tracas. La seule optimisation supplémentaire serait si vous pouvez faire la vue dans une vue matérialisée, mais les restrictions sont très contraignantes. –