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%わからないんだけど、それは一度に意味を成していたし、私は他のアイデアを開いている私は、パイプラインの機能に新たなんだ認めます
解決
あなたはあなたがWITH句を使用することができます意味の9i最小にしている、その後、パイプライン機能を使用している場合:
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