CREATE OR REPLACE TYPE TY_1 AS OBJECT
(
FN VARCHAR2(100),
SL NUMBER,
HD DATE
);
-- Example 1
CREATE OR REPLACE FUNCTION FN_RET_COL
RETURN TY_1
AS
OBJ_TY_1 TY_1 := TY_1(NULL,NULL,NULL);
BEGIN
SELECT FIRST_NAME,SALARY,HIRE_DATE
INTO OBJ_TY_1.FN, OBJ_TY_1.SL, OBJ_TY_1.HD
FROM EMPLOYEES
WHERE EMPLOYEE_ID = 120;
RETURN OBJ_TY_1;
END;
-- Example 2
CREATE OR REPLACE FUNCTION FN_RET_COL
RETURN TY_1
AS
OBJ_TY_1 TY_1;
BEGIN
SELECT TY_1(FIRST_NAME,SALARY,HIRE_DATE)
INTO OBJ_TY_1
FROM EMPLOYEES
WHERE EMPLOYEE_ID = 100;
RETURN OBJ_TY_1;
END;
-- Query
SELECT FN_RET_COL() FROM DUAL;
-- Modified Example 1(Throws Reference to uninitialized composite)
CREATE OR REPLACE FUNCTION FN_RET_COL
RETURN TY_1
AS
OBJ_TY_1 TY_1;
BEGIN
SELECT FIRST_NAME,SALARY,HIRE_DATE
INTO OBJ_TY_1.FN, OBJ_TY_1.SL, OBJ_TY_1.HD
FROM EMPLOYEES
WHERE EMPLOYEE_ID = 120;
RETURN OBJ_TY_1;
END;
示例1和示例2都工作正常。两者几乎完成相同的工作。 但我怀疑的是,示例1中的集合没有像示例2中那样初始化。它正在抛出错误。但是在示例2中,它没有初始化但工作正常。那么何时初始化集合变量并何时不需要?
答案 0 :(得分:2)
您无法引用未初始化集合的字段。在修改示例1中,您指的是OBJ_TY_1.FN,即特定字段,因此是错误。
在原始示例1中,集合已初始化,因此您可以引用这些字段。
在示例2中,集合在SELECT子句中初始化。