如何在 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;
我的记录类型如下:
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;