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

时间:2015-05-06 10:17:23

标签: 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),
     .....                                       ,
     .....                                       ,
     .....                                       ,
     .....                                       
)

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

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

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

2 个答案:

答案 0 :(得分:4)

您需要定义一个CONSTRUCTOR FUNCTION:

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;

答案 1 :(得分:2)

当您使用记录而不是对象时,无论如何都不必初始化它。您也可以使用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;