在oracle中初始化集合

时间:2014-01-15 19:04:56

标签: oracle collections plsql

 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中,它没有初始化但工作正常。那么何时初始化集合变量并何时不需要?

1 个答案:

答案 0 :(得分:2)

您无法引用未初始化集合的字段。在修改示例1中,您指的是OBJ_TY_1.FN,即特定字段,因此是错误。

在原始示例1中,集合已初始化,因此您可以引用这些字段。

在示例2中,集合在SELECT子句中初始化。