Loops 读入对象会抛出不一致的数据类型:expected-get-

Loops 读入对象会抛出不一致的数据类型:expected-get-,loops,plsql,cursor,Loops,Plsql,Cursor,是否可以在不需要中间表作为对象类型的情况下迭代游标 在我的模式中设置了以下事件表 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

是否可以在不需要中间表作为对象类型的情况下迭代游标

在我的模式中设置了以下事件表

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;
/   

您需要为表中返回的每一行构造一个
事件\u 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;
当您只是从普通关系表中选择普通列时,您会返回一个普通记录类型,而不是对象,
fetchinto
不会隐式地将其转换为一个

顺便说一下,第二个示例中的
lt\u evt\u tbl
是一个集合,而不是临时表

此外,无需定义自己的弱引用游标类型,因为已经提供了
sys\u refcursor
;虽然您当然可以将本机动态SQL用于ref游标,但您不需要这样做,而且静态代码更易于使用,因此我在上面的示例中将其设置为静态

更简单的版本:

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;

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