VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

关联数组

功能描述

关联数组也称索引表,是一组key-value键值对,每个key都是一个唯一索引。Vastbase支持在PL/SQL中定义关联数组类型,以及定义和使用关联数组变量,并支持关联数组元素的赋值与访问。

关联数组的使用中支持如下函数和过程:

方法 类型 描述
first 函数(function) 对于索引为 PLS_INTEGER 的关联数组,first 为最小的索引值。对于以字符串为索引的关联数组,first 为最低键值元素。
last 函数(function) 对于索引为 PLS_INTEGER 的关联数组,last 为最大的索引值。对于以字符串为索引的关联数组,last为最高键值元素。
delete 过程(procedure) 从关联数组中删除元素,有三种形式。
  • delete:从任何类型的关联数组中删除所有元素。
  • delete(n):删除索引为 n 的元素,如果该元素存在;否则,它什么都不做。
  • delete(m,n):如果m和n都存在且m<=n,则删除所在范围m..n内的所有元素,否则,它什么都不做。
  • prior 函数(function) 返回指定索引之前的索引。对于按字符串索引的关联数组,上一个索引由按排序顺序的键值确定。
    next 函数(function) 返回指定索引之后的索引。对于按字符串索引的关联数组,下一个索引由按排序顺序的键值确定。

    函数和过程的使用方法为assoc_array_name.method,其中assoc_array_name为关联数组。

    注意事项

    • 暂不支持关联数组作为独立的类型,其作为pl/pgsql内部类型,权限依赖pl/pgsql自定义函数、存储过程、包和包体的访问权限。
    • 当前版本暂不支持not null或null选项。
    • 关联数组排序索引暂不支持 binary_integer,long,type_attribute,rowtype_attribute,string。

    语法格式

    TYPE type_name is table of datatype [[not] null] index by 
    {
    PLS_INTEGER      | 
    BINARY_INTEGER   |
    VARCHAR          |
    VARCHAR2(v_size) | 
    LONG             | 
    STRING           |
    type_attribute   | 
    rowtype_attribute
    };
    

    参数说明

    • type_name

      关联数组名称。

    • datatype

      数据类型,可以是常用数据类型varchar、varchar2、number、interger、pls_integer、binary_integer以及自定义数据类型,不支持REF CURSOR和NCLOB类型。

    • null或者not null

      可选项,对关联数组的每个元素可为空或加非空约束。当前版本暂不支持该选项。

    • index

      index的数据类型如语法格式中所展示的类型。当前版本仅支持varchar2,varchar,pls_integer。

    • v_size

      字节长度大小。

    示例

    示例1:定义一个关联数组。

    CREATE OR REPLACE FUNCTION Fun() RETURNS int AS $$
    DECLARE
    TYPE ARRAY_INTEGER IS TABLE OF int index by varchar(20);   --定义类型
    ARRINT ARRAY_INTEGER;   --定义变量
    BEGIN
    ARRINT('TOM') := 99;    --通过变量下标给数组赋值
    RETURN ARRINT['TOM'];     --返回数组元素
    END;
    $$
    LANGUAGE plpgsql;
    

    返回结果如下,表示支持定义关联数组:

    CREATE FUNCTION
    

    示例2:在关联数组中使用函数,当索引类型为PLS_INTEGER时获取最大索引值。

    CREATE OR REPLACE FUNCTION fun3()  RETURNS VOID AS $$
    DECLARE
    Type aa_int_type IS TABLE OF int2 INDEX BY pls_integer;
    aa_int aa_int_type;
    BEGIN
    aa_int(1) := 3;
    aa_int(7) := 6;
    aa_int(5) := 12;
    raise info 'LAST=%',aa_int.LAST;
    END;
    $$
    LANGUAGE plpgsql;
    select fun3();
    

    返回结果如下,获取到最大索引值:

    INFO:  LAST=7
    CONTEXT:  referenced column: fun3
     fun3
    ------
    
    (1 row)