这感觉它应该是一件简单的事情,但我似乎无法让它正常工作。我有一个现有的过程(HDT_CORE_GETDATA_LSR_V31
),它返回一个使用以下代码构建的自定义游标:
TYPE CORE_REC IS RECORD
(
OrgID CHAR(20 BYTE)
, DistrictCode VARCHAR2(200 BYTE)
--52 other fields
, ReqSource VARCHAR2 (1020 BYTE)
);
TYPE CORE_REC_CURSOR IS REF CURSOR RETURN CORE_REC;
我正在尝试构建一个新函数,该函数将调用此过程并将INSERT
结果放入表中。
我使用变量RecordLoad
构建了新程序,该变量是基于类型的集合:
create or replace TYPE HDT_CORE_REC_V31 FORCE AS OBJECT
(
OrgID CHAR(20 BYTE)
, DistrictCode VARCHAR2(200 BYTE)
-- Same 52 other fields; meticulously matched to be exact
, ReqSource VARCHAR2 (1020 BYTE)
);
create or replace TYPE HDT_CORE_REC_TABLE_V31 IS TABLE OF HDT_CORE_REC_V31;
在新的proc中,我构建了两个变量:
LSRData HDT_CORE_MAIN_V31.CORE_REC_CURSOR;
RecordLoad SABASC02.HDT_CORE_REC_TABLE_V31 :=
SABASC02.HDT_CORE_REC_TABLE_V31();
然后我尝试了以下内容:
BEGIN
SABASC02.HDT_CORE_GETDATA_LSR_V31(LSRData, NULL, ParamOrgCode,'d', NULL,
NULL, NULL, NULL, NULL);
LOOP
FETCH LSRData BULK COLLECT INTO RecordLoad;
EXIT WHEN RecordLoad.COUNT = 0;
FOR indx IN RecordLoad.FIRST .. RecordLoad.LAST
LOOP
DBMS_OUTPUT.PUT_LINE('AssociateID = ' || RecordLoad(indx).AssociateID);
END LOOP;
END LOOP;
但是,这行代码:FETCH LSRData BULK COLLECT INTO RecordLoad;
会引发错误PLS-00386: type mismatch found at 'RECORDLOAD' between 'FETCH' cursor and 'INTO' variables.
显然这里存在不匹配,但我不确定如何解决。我已经检查并仔细检查了两个构造函数之间的所有字段是否在名称,顺序和数据类型中完全匹配。
我错过了什么?
答案 0 :(得分:1)
CORE_REC
记录类型和HDT_CORE_REC_V31
对象类型的类型不同,即使它们具有完全相同的字段和属性列表。因此,您无法从游标中批量收集将指定的记录类型返回到对象类型的集合。
相反,您需要将记录批量收集到记录类型集合中。
为此,您需要在HDT_CORE_MAIN_V31
软件包规范中添加类似于以下内容的声明:
TYPE CORE_REC_TABLE IS TABLE OF CORE_REC;
然后将SABASC02.HDT_CORE_REC_TABLE_V31
的引用替换为HDT_CORE_MAIN_V31.CORE_REC_TABLE
。
如果您确实需要使用对象类型而不是记录类型,则可以使用与此类似的代码从记录类型创建对象类型实例:
declare
obj_type HDT_CORE_REC_V31;
...
begin
...
obj_type := HDT_CORE_REC_V31( rec_type.OrgID
, DistrictCode
--52 other fields
, ReqSource);
...
end;
您甚至可以创建一个返回对象类型实例的游标,方法是使用对象类型构造函数围绕列列表,类似于:
select HDT_CORE_REC_V31( rec_type.OrgID
, DistrictCode
--52 other fields
, ReqSource) obj_tpe
from your_table;
但是,要使用上述查询的游标,您需要在TYPE CORE_OBJ_CURSOR IS REF CURSOR RETURN HDT_CORE_REC_V31
的行中使用不同的游标类型声明(注意:未经测试)。