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

时间:2014-09-16 17:11:44

标签: plsql oracle11g

我设计的功能是更大包装的一部分。该功能旨在获取区号并返回分配给该区的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)数据类型。

那么......导致错误的是什么?

任何帮助表示赞赏! :)

1 个答案:

答案 0 :(得分:3)

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;