在PL / SQL中,varray
可以在创建时初始化为:
TYPE colour_tab IS VARRAY(3) OF VARCHAR2(20);
french_colours colour_tab := colour_tab('RED','WHITE','BLUE');
是否有等效的PL / SQL记录类型初始化方法?
type location_record_type is record (
street_address varchar2(40),
postal_code varchar2(12),
city varchar2(30),
state_province varchar2(25),
country_id char(2) not null := 'US'
);
不,没有。您必须明确分配每个值。 Documentation reference here。
使用函数充当一种“构造函数”函数(请看函数f()):
DECLARE
TYPE ty_emp IS RECORD(
id INTEGER,
name VARCHAR(30),
deptcode VARCHAR(10)
);
TYPE ty_tbl_emp IS TABLE OF ty_emp;
tbl_emp ty_tbl_emp;
FUNCTION f ( -- <==============
id INTEGER,
name VARCHAR,
deptcode VARCHAR) RETURN ty_emp IS
e ty_emp;
BEGIN
e.id := id;
e.name := name;
e.deptcode := deptcode;
RETURN e;
END f;
BEGIN
tbl_emp := ty_tbl_emp(
f(1, 'Johnson', 'SALES'),
f(2, 'Peterson', 'ADMIN'));
Dbms_Output.put_line(tbl_emp(2).name);
END;
记录类型实际上是为容纳SELECT语句中的行而设计的。
....
type location_record_type is record (
street_address varchar2(40),
postal_code varchar2(12),
city varchar2(30),
state_province varchar2(25),
country_id char(2) not null := 'US'
);
type location_record_nt is table of location_record_type;
loc_recs location_record_nt;
begin
select street_name
, pcode
, city
, region
, country_code
bulk collect into loc_recs
from t69
where ....
显然,对于查询不是来自单个表的SELECT *的情况(因为在这种情况下,我们可以改用%ROWTYPE
。
记录初始化在其声明中执行并通过从DUAL中选择进入来记录分配:
declare
type location_record_type is record
(
street_address varchar2(40) := '1234 Fake Street',
postal_code varchar2(12) := '90210',
city varchar2(30) := 'Springfield',
state_province varchar2(25) := 'KY',
country_id char(2) not null := 'US'
);
v_location location_record_type;
begin
select
'4321 Another St.', '48288', 'Detroit', 'MI', v_location.country_id
into v_location from dual;
end;
/
您可以创建一个返回该记录类型的函数。
请参见下面的示例代码:
DECLARE
type location_record_type is record (
street_address varchar2(40),
postal_code varchar2(12),
city varchar2(30),
state_province varchar2(25),
country_id char(2) not null := 'US');
v_loc_rec location_record_type;
FUNCTION new_loc_rec RETURN location_record_type
IS
v_new_loc_rec location_record_type;
BEGIN
return v_new_loc_rec;
END;
BEGIN
v_loc_rec := new_loc_rec;
v_loc_rec.state_province := 'SomeState';
v_loc_rec.country_id := 'SU';
dbms_output.put_line('State: '||v_loc_rec.state_province||'; Country_ID: '||v_loc_rec.country_id);
v_loc_rec := new_loc_rec;
dbms_output.put_line('State: '||v_loc_rec.state_province||'; Country_ID: '||v_loc_rec.country_id);
END;
Oracle 18c允许使用qualified expressions初始化记录:
declare
type location_record_type is record
(
street_address varchar2(40),
postal_code varchar2(12),
city varchar2(30),
state_province varchar2(25),
country_id char(2) not null := 'US'
);
--Oracle 18c Qualified Expression:
v_location location_record_type :=
location_record_type('1234 Fake Street', '90210', 'Springfield', 'KY', 'US');
begin
dbms_output.put_line('It worked!');
end;
/
您可以在Oracle Live SQL here中运行以上示例代码。 (不幸的是,该站点需要登录。由于18c无法下载,但是尚没有许多方便的方法来测试新功能。)