Sql 如何初始化记录类型并克服ORA-06530:引用未初始化的复合错误

Sql 如何初始化记录类型并克服ORA-06530:引用未初始化的复合错误,sql,oracle,plsql,variable-assignment,runtimeexception,Sql,Oracle,Plsql,Variable Assignment,Runtimeexception,我想将这些值初始化为记录类型。下面是我的代码 我在运行时面临“ORA-06530:引用未初始化的复合错误”。代码编译得很好 CREATE OR REPLACE TYPE TY_PERSONAL_MASTER AS OBJECT ( ID NUMBER(20), FNAME VARCHAR2(30), LNAME VARCHAR2(30) ); CREATE OR REPLACE TYPE TY_PROF_MASTERS IS TABLE OF TY_PROF_MASTER;

我想将这些值初始化为
记录类型
。下面是我的代码

我在运行时面临“ORA-06530:引用未初始化的复合错误”。代码编译得很好

CREATE OR REPLACE TYPE TY_PERSONAL_MASTER AS OBJECT
(
ID      NUMBER(20),
FNAME   VARCHAR2(30),
LNAME   VARCHAR2(30)
);


CREATE OR REPLACE TYPE TY_PROF_MASTERS IS TABLE OF TY_PROF_MASTER;

CREATE OR REPLACE TYPE TY_PROF_MASTER AS OBJECT 
(
ID        NUMBER(20),
EMPLOYER  VARCHAR2(20),
DOJ       DATE
);

CREATE TABLE TABLE_HOBBIES
(
ID      NUMBER(20),
HNAME   VARCHAR2(20)
);


CREATE OR REPLACE PACKAGE INITIALIZE IS

TYPE PERSON IS RECORD(
PERSONAL        TY_PERSONAL_MASTER,
PROFESSIONAL    TY_PROF_MASTERS,
v_hobbies       TABLE_HOBBIES%ROWTYE
)

END INITIALIZE;

CREATE OR REPLACE PACKAGE BODY INITIALIZE IS

FUNCTION FN_INITIALIZE(P_ACTION IN VARCHAR2) RETURN BOOLEAN IS
L_TO_INITIALIZE PERSON;

BEGIN
L_TO_INITIALIZE.PERSONAL.ID := 1;
-- The above line throws "ORA-06530: Reference to uninitialized composite error" at runtime.
-- I have just given example of assigning 1 value. However, I want to initialize all the values. 

END FN_INITIALIZE;
END INITIALIZE;

它们是不同的类型,因此您必须以不同的方式处理它们:

CREATE OR REPLACE PACKAGE BODY INITIALIZE IS

  FUNCTION FN_INITIALIZE(P_ACTION IN VARCHAR2) RETURN BOOLEAN IS
    L_TO_INITIALIZE PERSON;
  BEGIN
    -- object so need to call constructor
    L_TO_INITIALIZE.PERSONAL := TY_PERSONAL_MASTER(1, 'Bob', 'Hope');
    -- can also assign values directly once created
    L_TO_INITIALIZE.PERSONAL.ID := 1;
    L_TO_INITIALIZE.PERSONAL.FNAME := 'Bob';
    L_TO_INITIALIZE.PERSONAL.LNAME := 'Hope';

    -- table type so need to call constructor
    L_TO_INITIALIZE.PROFESSIONAL := new TY_PROF_MASTERS();
    -- need to extend to make room for new entry
    L_TO_INITIALIZE.PROFESSIONAL.extend(1);
    -- object so need to call constructor
    L_TO_INITIALIZE.PROFESSIONAL(1) := new TY_PROF_MASTER(2, 'USO', date '1941-05-06');
    -- can also assign values directly once created
    L_TO_INITIALIZE.PROFESSIONAL(1).DOJ := date '1941-03-01';

    -- record so no constructor, just assign values
    L_TO_INITIALIZE.v_hobbies.ID := 3;
    L_TO_INITIALIZE.v_hobbies.HNAME := 'Fishing';

    RETURN TRUE;
  END FN_INITIALIZE;
END INITIALIZE;
/

它们是不同的类型,因此您必须以不同的方式处理它们:

CREATE OR REPLACE PACKAGE BODY INITIALIZE IS

  FUNCTION FN_INITIALIZE(P_ACTION IN VARCHAR2) RETURN BOOLEAN IS
    L_TO_INITIALIZE PERSON;
  BEGIN
    -- object so need to call constructor
    L_TO_INITIALIZE.PERSONAL := TY_PERSONAL_MASTER(1, 'Bob', 'Hope');
    -- can also assign values directly once created
    L_TO_INITIALIZE.PERSONAL.ID := 1;
    L_TO_INITIALIZE.PERSONAL.FNAME := 'Bob';
    L_TO_INITIALIZE.PERSONAL.LNAME := 'Hope';

    -- table type so need to call constructor
    L_TO_INITIALIZE.PROFESSIONAL := new TY_PROF_MASTERS();
    -- need to extend to make room for new entry
    L_TO_INITIALIZE.PROFESSIONAL.extend(1);
    -- object so need to call constructor
    L_TO_INITIALIZE.PROFESSIONAL(1) := new TY_PROF_MASTER(2, 'USO', date '1941-05-06');
    -- can also assign values directly once created
    L_TO_INITIALIZE.PROFESSIONAL(1).DOJ := date '1941-03-01';

    -- record so no constructor, just assign values
    L_TO_INITIALIZE.v_hobbies.ID := 3;
    L_TO_INITIALIZE.v_hobbies.HNAME := 'Fishing';

    RETURN TRUE;
  END FN_INITIALIZE;
END INITIALIZE;
/

在对之前两个问题的回答中,我们已经向您展示了如何做到这一点,您随后删除了这两个问题。@AlexPoole表示同意并深表歉意!我觉得我先前的问题提得不恰当。通过这个问题,我想知道如何初始化所有三种类型,即,
个人的
专业的
v_业余爱好
,在回答之前的两个问题时,您已经了解了如何进行初始化,然后删除了这两个问题。@AlexPoole同意了,非常抱歉!我觉得我先前的问题提得不恰当。通过这个问题,我想知道如何初始化所有三种类型,即,
个人
专业
业余爱好
,我还想知道在
记录
中初始化
记录
的语法是什么。i、 例如,
PROFESSIONAL
也是
个人记录
中的
记录
?您也可以直接分配给它的字段;与对象tyoe相同,但不需要首先调用构造函数。另外,我想知道在
记录中初始化
记录
的语法是什么。i、 例如,
PROFESSIONAL
也是
个人记录
中的
记录
?您也可以直接分配给它的字段;与对象tyoe相同,但无需首先调用构造函数。