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")
  )

然后创建了一个 Object 类型的 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:

anyboy 可以告诉我如何显示proc2的结果。

4

2 回答 2

2

问题是您试图将 type 的项目放入 typeEMPLOYEE%ROWTYPE的集合中EMP_DIS,这是一个包含EMP_TYPE对象的嵌套表类型。您需要将 EMPLOYEE 行转换为EMP_TYPE对象,以便将它们存储在 type 的集合中EMP_DIS

分享和享受。

于 2014-12-11T18:24:41.543 回答
0

麻烦从第二个程序开始。如果您尝试像这样运行它,您会发现不会发生批量收集到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;

如果你运行上面的,你会得到同样的错误。关键是你不能像这样批量收集。您可能想看看这个以了解区别是什么:将迭代的 fetch 替换为 BULK COLLECT

于 2014-12-11T22:48:12.323 回答