FETCH从自定义光标到集合

时间:2016-01-26 15:07:26

标签: types plsql oracle11g cursor fetch

这感觉它应该是一件简单的事情,但我似乎无法让它正常工作。我有一个现有的过程(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.

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

我错过了什么?

1 个答案:

答案 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的行中使用不同的游标类型声明(注意:未经测试)。