我正在设计一个函数,它是一个更大的包的一部分。该函数旨在获取地区代码,并返回分配给该地区的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;