我有类似以下的记录类型:
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
在其他情况下,我在包中声明了类型,我根本不需要初始化。这怎么可能?
答案 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;