我有以下代码,可以很好地构建由
VARCHAR2
索引的二维数组。但我有一个关于如何使用“空”第二级数组实例化顶级数组的问题。 (参见代码中的注释。)
我发现实例化初始数组(在
Add()
过程中)的唯一方法是声明一个虚拟变量(它本身就是一个空数组),并将其分配给顶级数组:
DECLARE
TYPE pt_array IS TABLE OF number INDEX BY VARCHAR2(25);
TYPE prj_array IS TABLE OF pt_array INDEX BY VARCHAR2(25);
pt_array_ pt_array;
pj_array_ prj_array;
PROCEDURE Add (
act_ IN VARCHAR2,
pt_ IN VARCHAR2,
val_ IN NUMBER )
IS
dummy_empty_array pt_array; -- initiate a dummy variable
BEGIN
IF not pj_array_.EXISTS(act_) THEN
pj_array_(act_) := dummy_empty_array; -- can I initiate here without having to declare a variable?
END IF;
IF not pj_array_(act_).EXISTS(pt_) THEN
pj_array_(act_)(pt_) := val_;
END IF;
END Add;
BEGIN
Add ('A', '123', 1);
Add ('A', '456', 1);
Add ('B', '456', 1);
END;
大多数语言都提供在需要时分配匿名数组的能力(即无需定义间歇变量)。例如,在 Javascript 中你只需执行
x = [];
即可。但我还没有找到在 PL/SQL 中做到这一点的方法。
我尝试了各种不同的语法,一个明显的例子如下(在编译时出现错误“不存在名为 'PT_ARRAY' 的函数”):
pj_array_(act_) := pt_array();
此外,如果您使用
EXTEND
子句声明数组/表,则使用关键字 INDEX BY
的概念不适用。
所以我的问题是是否可以在没有虚拟变量的情况下编写此代码(即启动空数组)?
Oracle Database 18c 中添加了对您想要的语法的支持 (
pj_array_(act_) := pt_array();
):
DECLARE
TYPE pt_array IS TABLE OF number INDEX BY VARCHAR2(25);
TYPE prj_array IS TABLE OF pt_array INDEX BY VARCHAR2(25);
pt_array_ pt_array;
pj_array_ prj_array;
PROCEDURE Add (
act_ IN VARCHAR2,
pt_ IN VARCHAR2,
val_ IN NUMBER )
IS
BEGIN
IF not pj_array_.EXISTS(act_) THEN
pj_array_(act_) := pt_array();
END IF;
IF not pj_array_(act_).EXISTS(pt_) THEN
pj_array_(act_)(pt_) := val_;
END IF;
END Add;
BEGIN
Add ('A', '123', 1);
Add ('A', '456', 2);
Add ('B', '456', 3);
dbms_output.put_line ( pj_array_ ('A')('123') );
dbms_output.put_line ( pj_array_ ('A')('456') );
dbms_output.put_line ( pj_array_ ('B')('456') );
END;
/
1
2
3