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;
非常感谢威廉!这正是我正在寻找的解决方案!谢谢您的时间:)