获取对象会引发不一致的数据类型:预期 - 得到 -

Posted

技术标签:

【中文标题】获取对象会引发不一致的数据类型:预期 - 得到 -【英文标题】:FEtching into an object throws inconsistent datatypes: expected - got - 【发布时间】:2018-02-26 12:15:12 【问题描述】:

是否可以在不需要中间 TABLE 作为 Object 类型的情况下迭代游标?

我的架构中有以下 EVENT_TABLE 设置

create TABLE EVENT_TABLE (
       UUID INTEGER, 
       EVENT_TYPE VARCHAR2(10)
);

INSERT INTO EVENT_TABLE values( 1, 'START');
INSERT INTO EVENT_TABLE values( 2, 'RUNNING');
INSERT INTO EVENT_TABLE values( 2, 'COMPLETE');


CREATE OR REPLACE TYPE EVENT_OBJ AS OBJECT (
       UUID INTEGER, 
       EVENT_TYPE VARCHAR2(10)
);
/

COMMIT;

declare 
    r EVENT_OBJ;
    TYPE cur_typ IS REF CURSOR;
    EVENT cur_typ;
BEGIN
  OPEN event FOR 'select * from EVENT_TABLE';
  LOOP
    FETCH event INTO r;
    EXIT WHEN event%NOTFOUND;
    DBMS_OUTPUT.put_line('NEW_UID:-' || R.UUID);
  END LOOP;
END;
/   

当我最后执行匿名块时,我得到以下异常

ORA-00932 不一致的数据类型:预期 - 得到 -

我之前看过一些示例,其中查询被提取到对象中,但我似乎无法让它工作。

通过如下创建一个临时表,匿名块完成并产生预期的DBMS输出?

declare 
    r EVENT_OBJ;
    TYPE cur_typ IS REF CURSOR;
    EVENT cur_typ;

    -- Temp table 
    TYPE EVENT_TBL IS TABLE OF EVENT_OBJ;
    lt_evt_tbl EVENT_TBL;

BEGIN
  select EVENT_OBJ (UUID,EVENT_TYPE ) bulk collect into lt_evt_tbl from EVENT_TABLE;
   FOR indx IN 1..lt_evt_tbl.COUNT
   LOOP
    DBMS_OUTPUT.put_line('NEW_UID:-' || lt_evt_tbl(indx).UUID);
  END LOOP;
END;
/   

【问题讨论】:

【参考方案1】:

您需要为从表返回的每一行构造一个event_obj 对象:

declare
    r event_obj;
    event sys_refcursor;
begin
    open event for
        select event_obj(uuid, event_type) from event_table;

    loop
        fetch event into r;
        exit when event%notfound;
        dbms_output.put_line('NEW_UID: ' || r.uuid);
    end loop;
end;

当您只从普通关系表中选择普通列时,您会得到一个普通的记录类型,而不是一个对象,并且fetch into 不会隐式地将其强制转换为一个。

顺便说一句,您在第二个示例中的 lt_evt_tbl 是一个集合,而不是一个临时表。

另外,不需要定义你自己的弱引用游标类型,因为sys_refcursor已经提供了;虽然你当然可以为你的引用游标使用原生动态 SQL,但你不需要,而且静态代码更容易使用,所以我在上面的示例中将其设为静态。

更简单的版本:

begin
    for r in (
        select event_obj(uuid, event_type) as event from event_table
    )
    loop
        dbms_output.put_line('NEW_UID: ' || r.event.uuid);
    end loop;
end;

【讨论】:

非常感谢威廉!这正是我正在寻找的解决方案!谢谢你的时间:)

以上是关于获取对象会引发不一致的数据类型:预期 - 得到 -的主要内容,如果未能解决你的问题,请参考以下文章

ORA-00932: 不一致的数据类型: 预期 - 得到 CLOB

ORA-00932不一致的数据类型预期 char 得到数字

如何修复 PL/SQL:ORA-00932:不一致的数据类型:预期的 CLOB 得到了 -

ORA-00932: 不一致的数据类型: 预期 - 得到 - ORA-06512:

ora-00932 不一致的数据类型预期数字得到 char plsql

ORA-00932: 不一致的数据类型: 预期 - 得到 clob 休眠/弹簧启动