PL / SQL - 在同一个查询中使用相同的管道函数两次
-
19-09-2019 - |
题
我试图用一个管道函数,以节省时间和减少我的查询冗余。 所讨论的功能从基于一些输入的参考表数据返回。在我从选择主数据表中的记录有多个列,所有参考参考表。我遇到的问题是,当我尝试使用管道函数不止一次在查询中,我得到一个“光标已经打开”的错误。
例如:
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;
这工作得很好,直到我说的第二个引用我的流水线功能(fn_getOvrdValXML),我现在得到了“光标已经打开”的错误。
的流水线功能很简单:
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;
光标是同样简单:
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;
有没有办法来解决这个问题,或者我应该尝试解决这个问题(有参考ovrd_val和输出XMLFOREST以同样的方式很多很多很多很多次的问题)有所不同?
我承认我是新来的流水线功能,所以我不是100%肯定这是一个合适的使用,但它在当时是有道理的,我愿意接受其他想法;)
解决方案
如果您使用的管道的功能,那么你就9i的最小,这意味着可以使用WITH子句:
WITH ovrdValXML AS (
select xov.id,
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)
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
JOIN ovrdValXML terr_code ON terr_code = vt.?
AND terr_code.id = vt.terr_cd_id
JOIN ovrdValXML ab_val_cd ON ab_val_cd = vt.?
AND ab_val_cd.id = vt.ab_val_cd
WHERE vt.id = IN_VID;
未经检验的,并且目前还不清楚要加入什么太 - 对连接标准因此?
其他提示
你有没有真的试图通过管道排前关闭您的游标,管道函数里面?
OPEN C_OvrdVal(in_ID);
FETCH c_OrdVal INTO my_chunk_variable;
CLOSE C_OrdVal;
PIPE ROW my_chunk_variable;
RETURN;
不隶属于 StackOverflow