您好,我是小DAI,专注于数据库管理员相关的技术问答,请问有什么可以帮您?

过程和函数的数组参数

您可以使用数组参数创建过程和函数,以便可以将数组变量或常量数组传递给它们。

支持以下流动场景:

  • 过程的数组输入/输出/输入输出参数

  • SUDF/TUDF 的数组输入参数

  • SUDF 的数组返回类型

  • 库过程/函数的数组参数

  • 匿名块/嵌入式 SQL 函数的数组输入参数

  • DML/查询中的数组变量。限制此功能仅支持服务器端查询参数的数组参数。无法使用客户端数组接口。数组参数不能用于最外层查询或调用。仅允许在嵌套查询或嵌套调用中使用数组参数。

    语法

    代码语法CREATE [OR REPLACE] PROCEDURE [()] [LANGUAGE ] [SQL SECURITY ] [DEFAULT SCHEMA ][READS SQL DATA ] [WITH ENCRYPTION] ASBEGIN [SEQUENTIAL EXECUTION] END ::= [{,}...] ::= [IN | OUT | INOUT] ::= [ARRAY] | |  代码语法CREATE FUNCTION [()] RETURNS [LANGUAGE ] [SQL SECURITY ][DEFAULT SCHEMA [DETERMINISTIC]] [WITH ENCRYPTION] AS BEGIN END ::= [{,}...] ::= [IN] ::= [ARRAY] | | ::= ::= [{, }...] ::= [ARRAY] 

    示例

    示例代码create procedure my_l_proc_out(out c int array, in b int array) asbegin c = array(123456, 7890); c[3] = :b[1]; c[4] = :b[2];end; do begin declare a int array; declare b int array = array(3, 4); call my_l_proc_out(:a, :b); select :a from dummy;END; 示例代码create function my_sudf_arr (in a int array) returns b int array asbegin b = subarray(:a, 1, 2);end; do begin declare arr_var int array = array(1, 2, 3, 4); select my_sudf_arr(:arr_var) x from dummy;end; 示例代码create function my_tudf_arr (in A int array) returns table(I int) asbegin B = unnest(:A); return select ":A" as I from :B;end; do begin declare arr_var int array = array(1, 2, 3, 4); select * from my_tudf_arr(:arr_var);end; 备注为了提高 SQLScript 可用性,不仅可以在 DML 和查询中使用常量数组,还可以使用数组变量。此外,还可以在 SELECT INTO 子句中使用数组变量。 示例代码create table tab1 (i int, a int array); do begin declare a int array = array(1, 2, 3); declare b int array; insert into tab1 values (1, :a); select tab1.A into b from tab1; select array(1,2,3) into b from dummy; insert into tab1 values (1, array(1, 2, 3)); select :a from dummy;end; 备注现在,系统视图 ELEMENT_TYPES 显示参数的元素数据类型(如果是数组类型)。ELEMENT_TYPES 视图具有列 SCHEMA_NAME、OBJECT_NAME、ELEMENT_NAME 和 DATA_TYPE_NAME。

    限制

    以下限制适用:

  • 不支持 LOB 类型数组参数。

  • 不支持数组参数的 DEFAULT VALUE。

  • 不支持在动态 SQL 的 USING 子句中使用数组参数。