云服务器内容精选

  • || 描述:数组与元素交叉组合进行连接,即数组与数组进行连接、元素与数组进行连接、数组与元素进行连接。 示例: 1 2 3 4 5 SELECT ARRAY[1,2,3] || ARRAY[4,5,6] AS RESULT; result --------------- {1,2,3,4,5,6} (1 row) 1 2 3 4 5 SELECT ARRAY[1,2,3] || ARRAY[[4,5,6],[7,8,9]] AS RESULT; result --------------------------- {{1,2,3},{4,5,6},{7,8,9}} (1 row) 1 2 3 4 5 SELECT 3 || ARRAY[4,5,6] AS RESULT; result ----------- {3,4,5,6} (1 row) 1 2 3 4 5 SELECT ARRAY[4,5,6] || 7 AS RESULT; result ----------- {4,5,6,7} (1 row)
  • LIMIT LIMIT函数可以返回数组的最大长度限制。 用法如下: varray.LIMIT或varray.LIMIT() 示例: 1 2 3 4 5 6 7 8 9 10 --演示在存储过程中对数组LIMIT函数的用法。 CREATE OR REPLACE PROCEDURE test_varray AS TYPE varray_type IS VARRAY(20) OF INT; v_varray varray_type; BEGIN v_varray := varray_type(1, 2, 3, 4, 5); DBMS_OUTPUT.PUT_LINE('v_varray.limit:' || v_varray.limit); END; / 执行结果: 1 2 call test_varray(); v_varray.limit:20
  • DELETE DELETE函数可以从数组删除数组中的所有元素。 用法如下: varray.DELETE或varray.DELETE() 示例: 1 2 3 4 5 6 7 8 9 10 11 --演示在存储过程中对数组DELETE函数的用法。 CREATE OR REPLACE PROCEDURE test_varray AS TYPE varray_type IS VARRAY(20) OF INT; v_varray varray_type; BEGIN v_varray := varray_type(1, 2, 3, 4, 5); v_varray.delete; DBMS_OUTPUT.PUT_LINE('v_varray.count:' || v_varray.count); END; / 执行结果: 1 2 call test_varray(); v_varray.count:0
  • EXISTS EXISTS函数可以判断数组下标是否存在。 用法如下: varray.EXISTS(index) 示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 --演示在存储过程中对数组EXISTS函数的用法。 CREATE OR REPLACE PROCEDURE test_varray AS TYPE varray_type IS VARRAY(20) OF INT; v_varray varray_type; BEGIN v_varray := varray_type(1, 2, 3); IF v_varray.EXISTS(1) THEN DBMS_OUTPUT.PUT_LINE('v_varray.EXISTS(1)'); END IF; IF NOT v_varray.EXISTS(10) THEN DBMS_OUTPUT.PUT_LINE('NOT v_varray.EXISTS(10)'); END IF; END; / 执行结果: 1 2 3 call test_varray(); v_varray.EXISTS(1) NOT v_varray.EXISTS(10)
  • TRIM TRIM函数可以从数组尾部删除指定数量的元素。 用法如下: varray.TRIM(size) 其中varray.TRIM这种无参的调用会默认入参为1,等价于varray.TRIM(1) 示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 --演示在存储过程中对数组TRIM函数的用法。 CREATE OR REPLACE PROCEDURE test_varray AS TYPE varray_type IS VARRAY(20) OF INT; v_varray varray_type; BEGIN v_varray := varray_type(1, 2, 3, 4, 5); v_varray.trim(3); DBMS_OUTPUT.PUT_LINE('v_varray.count' || v_varray.count); v_varray.trim; DBMS_OUTPUT.PUT_LINE('v_varray.count:' || v_varray.count); END; / 执行结果: 1 2 3 call test_varray(); v_varray.count:2 v_varray.count:1
  • 数组类型的使用 在使用数组之前,需要自定义一个数组类型。 在存储过程中紧跟AS关键字后面定义数组类型。定义方法为: TYPE array_type IS VARRAY(size) OF data_type [NOT NULL]; 其中: array_type:要定义的数组类型名。 VARRAY:表示要定义的数组类型。 size:取值为正整数,表示可以容纳的成员的最大数量。 data_type:要创建的数组中成员的类型。 NOT NULL: 可选约束,可以约束该数组中的元素均不为NULL。 在 GaussDB (DWS)中,数组会自动增长,访问越界会返回一个NULL,不会报错。越界写入数组会提示:Subscript outside of limit. 在存储过程中定义的数组类型,其作用域仅在该存储过程中。 建议选择上述定义方法的一种来自定义数组类型,当同时使用两种方法定义同名的数组类型时,GaussDB(DWS)会优先选择存储过程中定义的数组类型来声明数组变量。 GaussDB(DWS) 8.1.0之前版本, 由于数组可以自动增长,系统不会校验数组越界以及数组元素的长度限制。当前版本为了兼容Oracle的用法增加了相关约束。如果已经存在越界写入等场景,可通过在behavior_compat_options参数中配置varray_verification,来兼容之前不校验的行为。 示例:
  • EXTEND EXTEND函数主要是为了兼容Oracle的两种用法。在GaussDB(DWS)中,数组会自动增长,EXTEND函数不是必须的。如果是新写的存储过程,完全没有必要使用EXTEND函数。 EXTEND函数可以对数组进行扩展,EXTEND有两种调用方式。 方式一: EXTEND包含一个整型入参,表示数组向后扩展size大小的长度,EXTEND后COUNT和LAST函数的值也会有相应的变化。 用法如下: varray.EXTEND(size) 其中varray.EXTEND这种无参的调用默认会向后扩展1位等价于varray.EXTEND(1) 方式二: EXTEND包含两个整型入参,第一个参数代表向后扩展size大小的长度,第二个参数表示扩展后的数组元素值和之下标为index的元素相同。 用法如下: varray.EXTEND(size, index) 示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 --演示在存储过程中对数组EXTEND函数的用法。 CREATE OR REPLACE PROCEDURE test_varray AS TYPE varray_type IS VARRAY(20) OF INT; v_varray varray_type; BEGIN v_varray := varray_type(1, 2, 3); v_varray.extend(3); DBMS_OUTPUT.PUT_LINE('v_varray.count=' || v_varray.count); v_varray.extend(2,3); DBMS_OUTPUT.PUT_LINE('v_varray.count=' || v_varray.count); DBMS_OUTPUT.PUT_LINE('v_varray(7)=' || v_varray(7)); DBMS_OUTPUT.PUT_LINE('v_varray(8)=' || v_varray(7)); END; /
  • NEXT和PRIOR NEXT函数和PRIOR函数主要用于数组的循环遍历中,NEXT函数会根据入参index值,返回下一个数组元素的下标,若已经到达数组下标最大值则返回NULL。PRIOR函数会根据入参index值,返回上一个数组元素的下标,若已经到达数组下标最小值则返回NULL。 用法如下: varray.NEXT(index) varray.PRIOR(index) 示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 --演示在存储过程中对数组NEXT和PRIOR函数的用法。 CREATE OR REPLACE PROCEDURE test_varray AS TYPE varray_type IS VARRAY(20) OF INT; v_varray varray_type; i int; BEGIN v_varray := varray_type(1, 2, 3); i := v_varray.COUNT; WHILE i IS NOT NULL LOOP DBMS_OUTPUT.PUT_LINE('test prior v_varray('||i||')=' || v_varray(i)); i := v_varray.PRIOR(i); END LOOP; i := 1; WHILE i IS NOT NULL LOOP DBMS_OUTPUT.PUT_LINE('test next v_varray('||i||')=' || v_varray(i)); i := v_varray.NEXT(i); END LOOP; END; / 执行结果: 1 2 3 4 5 6 7 call test_varray(); test prior v_varray(3)=3 test prior v_varray(2)=2 test prior v_varray(1)=1 test next v_varray(1)=1 test next v_varray(2)=2 test next v_varray(3)=3
  • || 描述:数组与数组进行连接 示例: 1 2 3 4 5 SELECT ARRAY[1,2,3] || ARRAY[4,5,6] AS RESULT; result --------------- {1,2,3,4,5,6} (1 row) 1 2 3 4 5 SELECT ARRAY[1,2,3] || ARRAY[[4,5,6],[7,8,9]] AS RESULT; result --------------------------- {{1,2,3},{4,5,6},{7,8,9}} (1 row)
  • EXISTS EXISTS函数可以判断数组下标是否存在。 用法如下: varray.EXISTS(index) 示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 --演示在存储过程中对数组EXISTS函数的用法。 CREATE OR REPLACE PROCEDURE test_varray AS TYPE varray_type IS VARRAY(20) OF INT; v_varray varray_type; BEGIN v_varray := varray_type(1, 2, 3); IF v_varray.EXISTS(1) THEN DBMS_OUTPUT.PUT_LINE('v_varray.EXISTS(1)'); END IF; IF NOT v_varray.EXISTS(10) THEN DBMS_OUTPUT.PUT_LINE('NOT v_varray.EXISTS(10)'); END IF; END; / 执行结果: 1 2 3 call test_varray(); v_varray.EXISTS(1) NOT v_varray.EXISTS(10)
  • TRIM TRIM函数可以从数组尾部删除指定数量的元素。 用法如下: varray.TRIM(size) 其中varray.TRIM这种无参的调用会默认入参为1,等价于varray.TRIM(1) 示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 --演示在存储过程中对数组TRIM函数的用法。 CREATE OR REPLACE PROCEDURE test_varray AS TYPE varray_type IS VARRAY(20) OF INT; v_varray varray_type; BEGIN v_varray := varray_type(1, 2, 3, 4, 5); v_varray.trim(3); DBMS_OUTPUT.PUT_LINE('v_varray.count' || v_varray.count); v_varray.trim; DBMS_OUTPUT.PUT_LINE('v_varray.count:' || v_varray.count); END; / 执行结果: 1 2 3 call test_varray(); v_varray.count:2 v_varray.count:1
  • DELETE DELETE函数可以从数组删除数组中的所有元素。 用法如下: varray.DELETE或varray.DELETE() 示例: 1 2 3 4 5 6 7 8 9 10 11 --演示在存储过程中对数组DELETE函数的用法。 CREATE OR REPLACE PROCEDURE test_varray AS TYPE varray_type IS VARRAY(20) OF INT; v_varray varray_type; BEGIN v_varray := varray_type(1, 2, 3, 4, 5); v_varray.delete; DBMS_OUTPUT.PUT_LINE('v_varray.count:' || v_varray.count); END; / 执行结果: 1 2 call test_varray(); v_varray.count:0
  • LIMIT LIMIT函数可以返回数组的最大长度限制。 用法如下: varray.LIMIT或varray.LIMIT() 示例: 1 2 3 4 5 6 7 8 9 10 --演示在存储过程中对数组LIMIT函数的用法。 CREATE OR REPLACE PROCEDURE test_varray AS TYPE varray_type IS VARRAY(20) OF INT; v_varray varray_type; BEGIN v_varray := varray_type(1, 2, 3, 4, 5); DBMS_OUTPUT.PUT_LINE('v_varray.limit:' || v_varray.limit); END; / 执行结果: 1 2 call test_varray(); v_varray.limit:20
  • EXTEND EXTEND函数主要是为了兼容Oracle的两种用法。在GaussDB(DWS)中,数组会自动增长,EXTEND函数不是必须的。如果是新写的存储过程,完全没有必要使用EXTEND函数。 EXTEND函数可以对数组进行扩展,EXTEND有两种调用方式。 方式一: EXTEND包含一个整型入参,表示数组向后扩展size大小的长度,EXTEND后COUNT和LAST函数的值也会有相应的变化。 用法如下: varray.EXTEND(size) 其中varray.EXTEND这种无参的调用默认会向后扩展1位等价于varray.EXTEND(1) 方式二: EXTEND包含两个整型入参,第一个参数代表向后扩展size大小的长度,第二个参数表示扩展后的数组元素值和之下标为index的元素相同。 用法如下: varray.EXTEND(size, index) 示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 --演示在存储过程中对数组EXTEND函数的用法。 CREATE OR REPLACE PROCEDURE test_varray AS TYPE varray_type IS VARRAY(20) OF INT; v_varray varray_type; BEGIN v_varray := varray_type(1, 2, 3); v_varray.extend(3); DBMS_OUTPUT.PUT_LINE('v_varray.count=' || v_varray.count); v_varray.extend(2,3); DBMS_OUTPUT.PUT_LINE('v_varray.count=' || v_varray.count); DBMS_OUTPUT.PUT_LINE('v_varray(7)=' || v_varray(7)); DBMS_OUTPUT.PUT_LINE('v_varray(8)=' || v_varray(7)); END; /
  • NEXT和PRIOR NEXT函数和PRIOR函数主要用于数组的循环遍历中,NEXT函数会根据入参index值,返回下一个数组元素的下标,若已经到达数组下标最大值则返回NULL。PRIOR函数会根据入参index值,返回上一个数组元素的下标,若已经到达数组下标最小值则返回NULL。 用法如下: varray.NEXT(index) varray.PRIOR(index) 示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 --演示在存储过程中对数组NEXT和PRIOR函数的用法。 CREATE OR REPLACE PROCEDURE test_varray AS TYPE varray_type IS VARRAY(20) OF INT; v_varray varray_type; i int; BEGIN v_varray := varray_type(1, 2, 3); i := v_varray.COUNT; WHILE i IS NOT NULL LOOP DBMS_OUTPUT.PUT_LINE('test prior v_varray('||i||')=' || v_varray(i)); i := v_varray.PRIOR(i); END LOOP; i := 1; WHILE i IS NOT NULL LOOP DBMS_OUTPUT.PUT_LINE('test next v_varray('||i||')=' || v_varray(i)); i := v_varray.NEXT(i); END LOOP; END; / 执行结果: 1 2 3 4 5 6 7 call test_varray(); test prior v_varray(3)=3 test prior v_varray(2)=2 test prior v_varray(1)=1 test next v_varray(1)=1 test next v_varray(2)=2 test next v_varray(3)=3