私は次のようなテーブルを持っています:
CREATE TABLE EMPLOYEE
(
EMP_NAME VARCHAR2(30 BYTE) NOT NULL,
EMP_ID NUMBER NOT NULL,
SALARY NUMBER NOT NULL,
DEPT_ID NUMBER,
UNIQUE ("EMP_ID"),
FOREIGN KEY ("DEPT_ID") REFERENCES DEPARTMENT ("DEPT_ID")
)
次に、オブジェクト型の Employee テーブルとそのネストされたテーブルを作成しました。
create or replace TYPE EMP_TYPE AS OBJECT (
EMP_NAME VARCHAR2(30 BYTE),
EMP_ID NUMBER,
SALARY NUMBER,
DEPT_ID NUMBER
)
create or replace TYPE EMP_DIS as TABLE OF EMP_TYPE;
次のようにパッケージを作成しました:
create or replace
PACKAGE CURR_TRADE_TEST AS
TYPE EMP_DISPLAY IS TABLE OF EMPLOYEE%ROWTYPE; //Nested Table
PROCEDURE EMP_TRADE(E_T OUT EMP_DISPLAY); // proc 1
PROCEDURE EMP_TRD(EMP_TRD OUT EMP_DIS); // proc 2
END CURR_TRADE_TEST;
パッケージ本体として:
CREATE OR REPLACE
--proc 1
PACKAGE BODY CURR_TRADE_TEST AS
PROCEDURE EMP_TRADE(E_T OUT EMP_DISPLAY) AS
str VARCHAR2(1000);
BEGIN
STR:='select * from EMPLOYEE';
EXECUTE IMMEDIATE(STR) BULK COLLECT INTO E_T;
END EMP_TRADE;
--proc 2
PROCEDURE EMP_TRD(EMP_TRD OUT EMP_DIS) AS
str VARCHAR2(1000);
BEGIN
STR:='select * from EMPLOYEE';
EXECUTE IMMEDIATE(STR) BULK COLLECT INTO EMP_TRD;
END EMP_TRD;
END CURR_TRADE_TEST;
ここで、以下に示すように proc 1 を呼び出すと、期待される出力が得られます。
DECLARE
T_D CURR_TRADE_TEST.EMP_DISPLAY;
BEGIN
CURR_TRADE_TEST.EMP_TRADE(T_D);
FOR I IN T_D.FIRST..T_D.LAST
LOOP
DBMS_OUTPUT.PUT_LINE(T_D(I).EMP_NAME||' '||T_D(I).EMP_ID);
END LOOP;
end;
しかし、proc 2で呼び出すとエラーが発生します:
DECLARE
E_D EMP_DIS;
BEGIN
CURR_TRADE_TEST.EMP_TRD(E_D);
FOR I IN E_D.FIRST..E_D.LAST
LOOP
DBMS_OUTPUT.PUT_LINE(E_D(I).EMP_NAME||' '||E_D(I).EMP_ID);
END LOOP;
end;
Error report:
ORA-00932: inconsistent datatypes: expected - got -
ORA-06512: at "ONLINE_PROD_FX_STAGING.CURR_TRADE_TEST", line 12
ORA-06512: at line 4
00932. 00000 - "inconsistent datatypes: expected %s got %s"
*Cause:
*Action:
proc2の結果を表示する方法を教えてください。