如何在没有空参数的情况下初始化 PL/SQL 中的记录类型

Ste*_*gas 1 plsql initialization record

我有如下记录类型:

CREATE OR REPLACE TYPE CUSTOM_REC_TYPE AS OBJECT
(
     ID                                NUMBER(19),
     COLUMN1                           NUMBER(19),
     COLUMN2                           NUMBER(19),
     COLUMN3                           NUMBER(19),
     COLUMN4                           NUMBER(19),
     .....                                       ,
     .....                                       ,
     .....                                       ,
     .....                                       
)
Run Code Online (Sandbox Code Playgroud)

我需要初始化这种类型的记录。使用以下语法:

l_custom_rec                    :=    CUSTOM_REC_TYPE();
Run Code Online (Sandbox Code Playgroud)

不起作用。我收到消息:

PLS-00306: wrong number or types of arguments in call to 'CUSTOM_REC_TYPE'
Run Code Online (Sandbox Code Playgroud)

我想我需要将所有值作为参数传递,即:

l_custom_rec                    :=    CUSTOM_REC_TYPE(null, null, null, .....);
Run Code Online (Sandbox Code Playgroud)

我可以避免这种情况吗?有没有办法在没有这么长的初始化的情况下使用我的记录?(记录类型有 90 个组件)。如果我根本不初始化它,我会收到错误:

ORA-06530: Reference to uninitialized composite
Run Code Online (Sandbox Code Playgroud)

还有其他情况,我在包中声明类型,根本不需要初始化。这怎么可能?

Ton*_*ews 5

您需要定义一个构造函数:

create or replace type custom_rec_type as object
(
     id                                number(19),
     column1                           number(19),
     column2                           number(19),
     column3                           number(19),
     column4                           number(19),
     constructor function custom_rec_type
     ( id                                number default null,
       column1                           number default null,
       column2                           number default null,
       column3                           number default null,
       column4                           number default null
     ) return self as result
);

create or replace type body custom_rec_type as
     constructor function custom_rec_type
     ( id                                number default null,
       column1                           number default null,
       column2                           number default null,
       column3                           number default null,
       column4                           number default null
     ) return self as result
     is
     begin
        self.id := id;
        self.column1 := column1;
        self.column2 := column2;
        self.column3 := column3;
        self.column4 := column4;
        return;
     end;
end;
Run Code Online (Sandbox Code Playgroud)

现在你可以这样做:

declare
   crt1 custom_rec_type;
   crt2 custom_rec_type;
begin
   crt1 := custom_rec_type();
   crt2 := custom_rec_type(column4=>23);
end;
Run Code Online (Sandbox Code Playgroud)