我设计的功能是更大包装的一部分。该功能旨在获取区号并返回分配给该区的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)
数据类型。
那么......导致错误的是什么?
任何帮助表示赞赏! :)
答案 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;