PL/SQL发起多维数组INDEX BY VARCHAR2

问题描述 投票:0回答:1

我有以下代码,可以很好地构建由

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 plsql
1个回答
0
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.