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

How can I initialize a record type in PL/SQL without null parameters

我的记录类型如下:

CREATE OR REPLACE TYPE CUSTOM_REC_TYPE AS OBJECT
(
     ID                                NUMBER(19),
     COLUMN1                           NUMBER(19),
     COLUMN2                           NUMBER(19),
     COLUMN3                           NUMBER(19),
     COLUMN4                           NUMBER(19),
     .....                                       ,
     .....                                       ,
     .....                                       ,
     .....                                       
)

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

l_custom_rec                    :=    CUSTOM_REC_TYPE();

不起作用。我收到消息:

PLS-00306: wrong number or types of arguments in call to 'CUSTOM_REC_TYPE'

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

l_custom_rec                    :=    CUSTOM_REC_TYPE(null, null, null, .....);

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

ORA-06530: Reference to uninitialized composite

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

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

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;

现在您可以这样做了:

declare
   crt1 custom_rec_type;
   crt2 custom_rec_type;
begin
   crt1 := custom_rec_type();
   crt2 := custom_rec_type(column4=>23);
end;

当您使用记录而不是对象时,无论如何都不必初始化它。您也可以使用 tablename%rowtype 而不是显式定义类型。

declare
  TYPE CUSTOM_REC_TYPE IS RECORD
  (
   ID                                NUMBER(19),
   COLUMN1                           NUMBER(19),
   COLUMN2                           NUMBER(19),
   COLUMN3                           NUMBER(19),
   COLUMN4                           NUMBER(19),
   .....                                       
  );
  x custom_rec_type;
  y tablename%rowtype;
begin
  dbms_output.put_line(to_char(x.id));
end;