Types 从自定义游标提取到集合

Types 从自定义游标提取到集合,types,plsql,oracle11g,cursor,fetch,Types,Plsql,Oracle11g,Cursor,Fetch,这感觉应该是一件简单的事情,但我似乎无法让它正常工作。我有一个现有的过程(HDT\u CORE\u GETDATA\u LSR\u V31),它返回一个使用以下代码构建的自定义游标: TYPE CORE_REC IS RECORD ( OrgID CHAR(20 BYTE) , DistrictCode VARCHAR2(200 BYTE) --52 other fields , ReqSour

这感觉应该是一件简单的事情,但我似乎无法让它正常工作。我有一个现有的过程(
HDT\u CORE\u GETDATA\u LSR\u 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;
我正在尝试构建一个新函数,该函数将调用此过程并将结果插入表中

我使用变量
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;
在新程序中,我构建了两个变量:

    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:在'FETCH'游标和'INTO'变量之间的'RECORDLOAD'处发现类型不匹配。

很明显,这里存在不匹配,但我不确定如何解决。我已经检查并再次检查了两个构造函数之间的所有字段是否在名称、顺序和数据类型上完全匹配


我缺少什么?

记录类型和
HDT\u CORE\u REC\u V31
对象类型不是相同的类型,即使它们具有完全相同的字段和属性列表。因此,您不能从返回指定记录类型的游标大容量收集到对象类型集合中

相反,您需要将记录批量收集到记录类型集合中

为此,您需要在
HDT\u CORE\u MAIN\u V31
软件包规范中添加类似于以下内容的声明:

TYPE CORE_REC_TABLE IS TABLE OF CORE_REC;
然后将对
SABASC02.HDT\u CORE\u REC\u TABLE\u V31的引用替换为
HDT\u CORE\u MAIN\u V31.CORE\u REC\u 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;
您甚至可以通过使用对象类型构造函数包围列列表来创建返回对象类型实例的游标,如下所示:

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\u OBJ\u cursor IS REF cursor RETURN HDT\u CORE\u REC\u V31
(注意:未测试)。

尝试注释字段块以隔离causeThanks@Sentinel!你的帖子让我找到了编写相同解决方案的方法。您是正确的,根本原因是我使用的两个数据类型虽然构造非常相似,但实际上并不完全相同。因此,我将代码声明更改为:
lsrdatahdt\u CORE\u MAIN\u V31.CORE\u REC\u CURSOR;RecordLoad HDT\u CORE\u MAIN\u V31.CORE\u REC
这使我能够
获取
并使用
插入
语句将记录加载到表中。