여러 레코드를 가져 오기 위해 파이프 라인 함수가있는 Oracle 패키지를 작성하고 있습니다. 쿼리는 여러 조인 된 테이블에 관한 것이며, 이는 다른 테이블에 저장됩니다. 유형 레코드에 대해 TYPE RECORD 및 TABLE TYPE 을 만든 다음 쿼리와 함께 파이프 라인 된 함수이지만 패키지를 컴파일 할 때 "expression is of wrong type" 오류가 발생 합니다.
다음은 정의 패키지입니다.
CREATE OR REPLACE PACKAGE MYPACKAGE_PKG AS
TYPE GLD_R IS RECORD (
ID NUMBER,
PRCCVE NUMBER(7,0),
LOTCVE NUMBER(7,0),
EPCSEQ NUMBER(18,0),
EPCBNK CHAR(3)
);
TYPE GLD_T IS TABLE OF GLD_R;
FUNCTION MY_FUNCTION(_NUM NUMBER) RETURN GLD_T PIPELINED;
END;
다음은 바디 패키지입니다.
CREATE OR REPLACE PACKAGE BODY MYPACKAGE_PKG AS
FUNCTION MY_FUNCTION(_NUM NUMBER) RETURN GLD_T PIPELINED
AS
CURSOR T_CUR IS
SELECT
T1.ID,
T2.COLUMN01,
T2.COLUMN02,
T3.COLUMN01,
T3.COLUMN02
FROM
TABLE01 T1
INNER JOIN TABLE02 T2 ON
T1.COLUMN03 = T2.ID
INNER JOIN TABLE03 T3 ON
T1.COLUMN04 = T2.ID
WHERE
T1.COLUMN01 = _NUM
BEGIN
FOR REC IN T_CUR LOOP
PIPE ROW (REC);
END LOOP;
END MY_FUNCTION;
END;
내가 뭘 잘못하고 있다고 말할 수 있니?
다음과 같아야합니다.
먼저 테이블 (컴파일이 실패하지 않도록) :
SQL> create table table01 (id number,column01 number, column03 number, column04 number);
Table created.
SQL> create table table02 (id number, column01 number, column02 number);
Table created.
SQL> create table table03 (id number, column01 number, column02 number);
Table created.
패키지 사양 :
SQL> CREATE OR REPLACE PACKAGE MYPACKAGE_PKG AS
2
3 TYPE GLD_R IS RECORD (
4 ID NUMBER,
5 PRCCVE NUMBER(7,0),
6 LOTCVE NUMBER(7,0),
7 EPCSEQ NUMBER(18,0),
8 EPCBNK CHAR(3)
9 );
10
11 TYPE GLD_T IS TABLE OF GLD_R;
12
13 FUNCTION MY_FUNCTION(p_NUM NUMBER) RETURN GLD_T PIPELINED;
14
15 END;
16 /
Package created.
패키지 본체 :
SQL> CREATE OR REPLACE PACKAGE BODY MYPACKAGE_PKG AS
2
3 FUNCTION MY_FUNCTION(p_NUM NUMBER) RETURN GLD_T PIPELINED
4 AS
5 CURSOR T_CUR IS
6 SELECT
7 T1.ID,
8 T2.COLUMN01 t2c01,
9 T2.COLUMN02 t2c02,
10 T3.COLUMN01 t3c01,
11 T3.COLUMN02 t3c02
12 FROM
13 TABLE01 T1
14 INNER JOIN TABLE02 T2 ON
15 T1.COLUMN03 = T2.ID
16 INNER JOIN TABLE03 T3 ON
17 T1.COLUMN04 = t3.id -- not T2.ID
18 WHERE
19 T1.COLUMN01 = p_NUM;
20
21 myrec gld_r;
22 BEGIN
23 FOR REC IN T_CUR LOOP
24 myrec.id := rec.id;
25 myrec.prccve := rec.t2c01;
26 myrec.lotcve := rec.t2c02;
27 myrec.epcseq := rec.t3c01;
28 myrec.epcbnk := rec.t3c02;
29 PIPE ROW (myrec);
30 END LOOP;
31 END MY_FUNCTION;
32
33 END;
34 /
Package body created.
SQL>
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다