【问题标题】:Nested table declared as Object type in oracle在 oracle 中声明为对象类型的嵌套表
【发布时间】:2014-12-12 06:48:12
【问题描述】:

我有一个表格:

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:

谁能告诉我如何显示 proc2 的结果。

【问题讨论】:

    标签: sql oracle plsql nested-table


    【解决方案1】:

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

    分享和享受。

    【讨论】:

    • 我只是在 proc 2 中做了一个小改动。替换 STR:='select * from EMPLOYEE'; with STR:='select EMP_TYPE (EMP_NAME,EMP_ID,SALARY,DEPT_ID) from EMPLOYEE';它工作正常。但是你能告诉我上面的陈述是什么意思吗?
    • 在 java 中也正在发生三件事。 1)Array arr = CallableStatement.getArry(1) 2) 使用 arr.getArray() 制作 Object[] 数组的第一个。 3) 然后为每个对象将其转换为 Struct 并执行 getAttributes()。有任何简单的方法。对不起,我在这个线程中问 java。
    • 我建议你应该打开一个新问题来获得这种 Java 建议。
    【解决方案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;
    

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

    【讨论】:

    • 很好,很高兴我的回答对您有所帮助。这不是强制性的,但如果我或其他答案确实回答了您的问题,您可以接受该答案,并且您也可以对答案进行投票以表明该答案具有一定的价值。
    猜你喜欢
    • 2018-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2013-07-20
    • 1970-01-01
    • 2010-10-31
    相关资源
    最近更新 更多