南大通用 GBase8s 集合类型之变长数组介绍

13 阅读5分钟

原文链接:www.gbase.cn/community/p…
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。

GBase 8s兼容oracle的PL/SQL编程语言,PL/SQL 语法需要显式设置环境变量SQLMODE为’ORACLE’后才能生效,默认情况下8s的SQLMODE为’GBASE’,此时不支持 PL/SQL 语法。本文将介绍GBase 8s兼容ORACLE模式中的变长数组类型,包括它们的使用场景、特点以及如何有效利用它们来提高数据库操作的效率。
兼容ORACLE的集合类型包括三种,分别是关联数组类型、变长数组类型、嵌套表类型,本文主要讲述变长数组类型及其变量的使用。变长数组的元素数量需要指定,索引类型为整数,未初始化前其变量为无效状态,可以在plsql块中定义,也可以在模式级别定义。

关联数组是一组键值对,每个键都是一个唯一的索引,用于定位与语法variable_name(index)相关联的值。

语法

TYPE type_name IS VARRAY(5) OF datatype;
CREATE TYPE type_name IS VARRAY(5) OF datatype;

 

特点

  • 必须先初始化
  • 索引是下限为1
  • 按照顺序存储

变长数组的比较

  • 变量与NULL比较时使用 is (not) null,不使用关系运算符=
  • 不支持变量直接比较:v1=v2
  • 只支持变量元素比较:v1(1)=v(2) 

变长数组的应用

CREATE OR REPLACE PACKAGE PKG_1 AS
procedure print_team(heading varchar2);
procedure p1;
END;
/
CREATE OR REPLACE PAKCAGE BODY PKG_1 AS
   TYPE Foursome IS VARRAY(4) OF VARCHAR2(15); 
   team Foursome := Foursome('John', 'Mary', 'Alberto', 'Juanita');
   PROCEDURE print_team (heading VARCHAR2) IS 
   BEGIN
       DBMS_OUTPUT.PUT_LINE(heading);
       FOR i IN 1..4 LOOP
           DBMS_OUTPUT.PUT_LINE(i || '.' || team(i));
       END LOOP;
       DBMS_OUTPUT.PUT_LINE('---'); 
   END;
PROCEDURE P1 AS
BEGIN 
       print_team('2001 Team:');
       team(3) := 'Pierre';  
       team(4) := 'Yvonne';
       print_team('2005 Team:');
       team := Foursome('Arun', 'Amitha', 'Allan', 'Mae');
       print_team('2009 Team:');
END;
end;
/  

 

运行结果:

2001 Team:
1.John
2.Mary
3.Alberto
4.Juanita
---
2005 Team:
1.John
2.Mary
3.Pierre
4.Yvonne
---
2009 Team:
1.Arun
2.Amitha
3.Allan
4.Mae
---

集合类型的方法

DELETE

(1)delete 删除集合的所有元素,删除后立即释放内存
(2)从嵌套表或关联数组中删除部分元素(varray不支持),保留已删除元素的占位符
delete(n):删除索引为n的元素
delete(n,m):删除索引n到m的所有元素,n<=m

 

TRIM

(1)从末尾删除元素
(2)只适用于嵌套表和变长数组(关联数组不支持)
TRIM如果集合至少有一个元素,则从集合末尾删除一个元素;否则,它会引发预定义的异常SUBSCRIPT_BEYOND_COUNT。
TRIM(n)如果末尾至少有n个元素,则从集合末尾删除n个元素;否则,它会引发预定义的异常SUBSCRIPT_BEYOND_COUNT。
TRIM根据集合的内部大小进行操作。也就是说,如果DELETE删除了一个元素,但为它保留了一个占位符,那么TRIM认为该元素存在。因此,TRIM可以删除已删除的元素。

EXTEND

(1)在变长数组或嵌套表后扩展元素空间(关联数组不需要)
(2)EXTEND方法有以下形式:
EXTEND将一个空元素附加到集合中。
EXTEND(n)将n个空元素附加到集合中。
EXTEND(n,i) 将n个元素附加到集合中,元素值与下标为i的元素一致。
EXTEND根据集合的内部大小进行操作。也就是说,如果DELETE删除了一个元素,但为它保留了一个占位符,那么EXTEND会认为该元素存在。

 

EXISTS

(1)判断集合类型变量的一个元素是否存在
(2)collection_name.exists(n):如果第n个元素存在则返回true,否则返回false,当n超出范围时也返回false
(3)delete后的元素,exists(n)返回false,即使该元素有占位符

 

FIRST  LAST

(1)集合元素数量>=1时,first和last返回第一个和最后一个元素的下标
(2)如果集合为空,first和last都返回false
(3)对于PLS_INTEGER索引的关联数组,第一个和最后一个元素分别是索引最小和最大的元素。对于按字符串索引的关联数组,第一个和最后一个元素分别是键值最低和最高的元素。
(4)对于嵌套表,LAST等于COUNT,除非从其中间删除元素,此时,LAST大于COUNT。
(5)对于不为空的varray,FIRST总是返回1。对于每个varray,LAST总是等于COUNT。

COUNT

(1)COUNT是一个返回集合中元素数量的函数(忽略已删除的元素,即使DELETE为它们保留了占位符)。
(2)对于变长数组,COUNT始终等于LAST。如果增加或减少varray的大小(使用EXTEND或TRIM方法),则COUNT的值会更改。
(3)对于嵌套表,LAST等于COUNT,除非从其中间删除元素,此时,LAST大于COUNT。

LIMIT

(1)LIMIT是一个函数,它返回集合可以具有的最大元素数。
(2)如果集合没有最大元素数,LIMIT将返回NULL。
(3)只有varray具有最大大小。

PRIOR  NEXT

(1)PRIOR和NEXT是允许您在集合中前后移动的函数(忽略已删除的元素,即使DELETE为它们保留占位符)。这些方法对于遍历稀疏集合非常有用。
(2)PRIOR返回元素的前置索引,NEXT返回元素的后置索引
(3)对于第一个元素,前置为NULL,对于最后一个元素,前置为NULL
(4)对于变长数组,n>v.limit时,v(n).prior=v.last,v(n).next=null
(5)delete(4)后,v.next(3)=5  ,  v.prior(5)=3
(6)v(4)=null,v.next(3)=4 ,v.prior(5)=4

通过本文的介绍,你已经了解了 GBase 8s 中变长数组的使用方法、特点及其在 PL/SQL 编程中的应用。变长数组提供了一种灵活的方式来存储和操作一组具有相同数据类型的元素,适用于多种场景。希望这些内容能帮助你在实际开发中更高效地利用变长数组。如果你在使用过程中遇到任何问题,欢迎随时在社区中提问,我们在这里为你提供支持!

原文链接:www.gbase.cn/community/p…
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。