0

私は次のようなテーブルを持っています:

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の結果を表示する方法を教えてください。

4

2 に答える 2

2

問題は、オブジェクトを保持するネストされたテーブル型であるEMPLOYEE%ROWTYPEtype のコレクションに type の項目を入れようとしていることです。タイプのコレクションに格納するには、EMPLOYEE 行をオブジェクトに変換する必要があります。EMP_DISEMP_TYPEEMP_TYPEEMP_DIS

共有してお楽しみください。

于 2014-12-11T18:24:41.543 に答える
0

トラブルは2番目の手順で始まります。このように実行しようとすると、EMP_TRDのタイプへの一括収集EMP_DISが発生しないことがわかります。

declare
  str VARCHAR2(1000);
  EMP_TRD EMP_DIS;
BEGIN
  STR:='select * from EMPLOYEE';
  EXECUTE IMMEDIATE(STR) BULK COLLECT INTO EMP_TRD;
END;

上記を実行すると、同じエラーが発生します。ポイントは、このようにまとめて集めることができないということです。違いが何であるかを理解するために、これを見たいと思うかもしれません:イテレーションのフェッチを BULK COLLECT に置き換えます。

于 2014-12-11T22:48:12.323 に答える