人。这是PL / SQL中一个简单的二维数组样本,它运行得很好。
declare
type a is table of number;
type b is table of a;
arr b := b(a(1, 2), a(3, 4));
begin
for i in arr.first .. arr.last loop
for j in arr(i).first .. arr(i).last loop
dbms_output.put_line(arr(i) (j));
end loop;
end loop;
end;
我需要做的是为 RECORDS
的表创建类似的内容。像这样:
type a is record(a1 number, a2 number);
type b is table of a;
问题是,我可以手动初始化这种数组,还是应该由bulk collects
或类似数据填充?与上面相同的语法似乎不起作用,我无法在手册中找到任何初始化示例。
答案 0 :(得分:17)
RECORD没有“构造函数”语法,所以你必须像这样填充它们:
declare
type a is record(a1 number, a2 number);
type b is table of a;
arr b := b();
begin
arr.extend(2);
arr(1).a1 := 1;
arr(1).a2 := 2;
arr(2).a1 := 3;
arr(2).a2 := 4;
end;
答案 1 :(得分:13)
这没有对象,但你必须为类型'a'值声明一个构造函数。
declare
type a is record(a1 number, a2 number);
type b is table of a;
arr b;
--Constructor for type a
function a_(a1 number, a2 number) return a is
r_a a;
begin
r_a.a1 := a1;
r_a.a2 := a2;
return(r_a);
end;
begin
arr := b(a_(1, 2), a_(3, 4), a_(5, 6), a_(7, 8));
for i in arr.first .. arr.last loop
dbms_output.put_line(arr(i).a1||', '||arr(i).a2);
end loop;
end;
答案 2 :(得分:3)
自版本18c Qualified Expressions起提供了一种定义复杂数据类型的值的替代方法。引用:
从Oracle Database 18c版开始,任何PL / SQL值都可以由表达式(例如,用于记录或关联数组)提供,就像构造函数提供抽象数据类型值一样。在PL / SQL中,我们使用术语“限定表达式”和“聚合”,而不是SQL术语“类型构造器”,但是功能是相同的。
这是一个可行的示例:
declare
type a is record (a1 number, a2 number);
type b is table of a index by varchar2 (16);
arr b := b ('key1' => a (1, 2), 'key2' => a (3, 4));
begin
declare key varchar2 (16) := arr.first; begin
<<foreach>> loop
dbms_output.put_line (arr(key).a1||','||arr (key).a2);
key := arr.next (key);
exit foreach when key is null;
end loop; end;
end;
/
PL/SQL procedure successfully completed.
1,2
3,4