PLS-00487 错误 - 对变量'CHAR'的引用无效



我正在设计一个函数,它是一个更大的包的一部分。该函数旨在获取地区代码,并返回分配给该地区的10-15家商店的唯一ID集合。该函数旨在返回一个集合,该集合可以像表一样进行查询,即在SQL语句中使用table函数。

我创建了以下类型:

架构级别类型:

create or replace TYPE HDT_CORE_ORGIDS AS TABLE OF CHAR(20);

和包装内类型

TYPE CORE_ORGIDS IS TABLE OF CHAR(20) INDEX BY BINARY_INTEGER;

这是功能代码:

     FUNCTION FindDistrictOrgs(
           ParamOrgCode VARCHAR2
      )
      RETURN HDT_CORE_ORGIDS
      AS
           ReturnOrgs HDT_CORE_ORGIDS := HDT_CORE_ORGIDS();
           FDOTemp HDT_CORE_MAIN.CORE_ORGIDS; 
           i BINARY_INTEGER := 0;
           CURSOR FDOCurr IS
                SELECT org.id AS OrgID
                     FROM tp2.tpt_company org
                     WHERE LEVEL = 2
                     START WITH org.name = ParamOrgCode
                     CONNECT BY PRIOR org.id = org.parent_id;
      BEGIN
           OPEN FDOCurr;
                LOOP
                     i := i +1;
                     FETCH FDOCurr INTO FDOTemp(i);
                     EXIT WHEN FDOCurr%NOTFOUND;
                END LOOP;
           IF FDOTemp.EXISTS(FDOTemp.FIRST) THEN
                ReturnOrgs.EXTEND(FDOTemp.LAST);
                FOR x IN FDOTemp.FIRST .. FDOTemp.LAST LOOP
                     ReturnOrgs(x) := FDOTemp(x).OrgID;
                END LOOP;
           END IF; 
           CLOSE FDOCurr;
           RETURN ReturnOrgs;         
 END FindDistrictOrgs ;

我在的线路上得到PLS-00487:Invalid Reference to variable 'CHAR'

                         ReturnOrgs(x) := FDOTemp(x).OrgID;

我仔细检查了SQL返回的值(org.id AS OrgID)是否为CHAR(20 BYTE)数据类型。

所以。。。错误的原因是什么?

感谢您的帮助!:)

OrgID是您在光标中为列提供的别名,它对集合没有任何意义。由于这两个集合都是简单的类型,您应该只做:

ReturnOrgs(x) := FDOTemp(x);

您使用的语法意味着FDOTemp是对象的集合,并且您试图引用对象的OrgID属性;但是由于CHAR不是一个对象类型,所以这是错误的。当这样看的时候,错误消息甚至有一定的意义,尽管如果你还不知道出了什么问题,它并没有太大的帮助。。。当你这样做的时候并没有完全的帮助。

顺便说一句,您可以使用bulk collect来填充集合,而不需要光标或循环,或者使用额外的集合:

SELECT org.id
BULK COLLECT INTO ReturnOrgs
FROM tp2.tpt_company org
WHERE LEVEL = 2
START WITH org.name = ParamOrgCode
CONNECT BY PRIOR org.id = org.parent_id;
RETURN ReturnOrgs;

最新更新