PL/SQL- 동일한 쿼리에서 동일한 파이프 라인 기능을 두 번 사용하십시오.

StackOverflow https://stackoverflow.com/questions/1903908

문제

파이프 라인 기능을 사용하여 시간을 절약하고 쿼리의 중복성을 줄이려고합니다. 문제의 함수는 일부 입력을 기반으로 참조 테이블의 데이터를 반환합니다. 메인 데이터 테이블의 레코드에서 선택한 레코드는 모두 참조 테이블을 참조하는 여러 열이 있습니다. 내가 겪는 문제는 쿼리에서 파이프 라인 기능을 두 번 이상 사용하려고 할 때 "커서 이미 열기"오류를 얻는다는 것입니다.

예를 들어:

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를 출력 해야하는 문제)?

나는 파이프 라인 기능을 처음 접했음을 인정하므로 이것이 적절한 용도라고 확신하지는 않지만 당시에는 의미가 있었고 다른 아이디어에 열려 있습니다.)

도움이 되었습니까?

해결책

파이프 라인 기능을 사용하는 경우 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;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top