FEtching 到对象中会抛出不一致的数据类型:预期 - 得到 -
FEtching into an object throws inconsistent datatypes: expected - got -
是否可以在不需要中间 TABLE 作为对象类型的情况下遍历游标?
我的架构中有以下 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 数据类型不一致:预期 - 得到 -
我以前见过将查询提取到对象中的示例,但我似乎无法让它工作。
通过如下创建临时 table,匿名块完成并生成预期的 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;
/
您需要为从 table:
返回的每一行构造一个 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;
当您只是 select 来自普通关系 table 的普通列时,您得到的是普通记录类型,而不是对象,并且 fetch into
不会隐式地将其转换为一.
顺便说一下,第二个示例中的 lt_evt_tbl
是一个集合,而不是一个临时文件 table。
此外,不需要定义自己的弱引用游标类型,因为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;
是否可以在不需要中间 TABLE 作为对象类型的情况下遍历游标?
我的架构中有以下 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 数据类型不一致:预期 - 得到 -
我以前见过将查询提取到对象中的示例,但我似乎无法让它工作。
通过如下创建临时 table,匿名块完成并生成预期的 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;
/
您需要为从 table:
返回的每一行构造一个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;
当您只是 select 来自普通关系 table 的普通列时,您得到的是普通记录类型,而不是对象,并且 fetch into
不会隐式地将其转换为一.
顺便说一下,第二个示例中的 lt_evt_tbl
是一个集合,而不是一个临时文件 table。
此外,不需要定义自己的弱引用游标类型,因为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;