云服务器内容精选

  • 示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 下面示例中用到的表定义如下: gaussdb=# \d emp_rec Table "public.emp_rec" Column | Type | Modifiers ----------+--------------------------------+----------- empno | numeric(4,0) | not null ename | character varying(10) | job | character varying(9) | mgr | numeric(4,0) | hiredate | timestamp(0) without time zone | sal | numeric(7,2) | comm | numeric(7,2) | deptno | numeric(2,0) | --演示在函数中对数组进行操作。 gaussdb=# CREATE OR REPLACE FUNCTION regress_record(p_w VARCHAR2) RETURNS VARCHAR2 AS $$ DECLARE --声明一个record类型. type rec_type is record (name varchar2(100), epno int); employer rec_type; --使用%type声明record类型 type rec_type1 is record (name emp_rec.ename%type, epno int not null :=10); employer1 rec_type1; --声明带有默认值的record类型 type rec_type2 is record ( name varchar2 not null := 'SCOTT', epno int not null :=10); employer2 rec_type2; CURSOR C1 IS select ename,empno from emp_rec order by 1 limit 1; BEGIN --对一个record类型的变量的成员赋值。 employer.name := 'WARD'; employer.epno = 18; raise info 'employer name: % , epno:%', employer.name, employer.epno; --将一个record类型的变量赋值给另一个变量。 employer1 := employer; raise info 'employer1 name: % , epno: %',employer1.name, employer1.epno; --将一个record类型变量赋值为NULL。 employer1 := NULL; raise info 'employer1 name: % , epno: %',employer1.name, employer1.epno; --获取record变量的默认值。 raise info 'employer2 name: % ,epno: %', employer2.name, employer2.epno; --在for循环中使用record变量 for employer in select ename,empno from emp_rec order by 1 limit 1 loop raise info 'employer name: % , epno: %', employer.name, employer.epno; end loop; --在select into 中使用record变量。 select ename,empno into employer2 from emp_rec order by 1 limit 1; raise info 'employer name: % , epno: %', employer2.name, employer2.epno; --在cursor中使用record变量。 OPEN C1; FETCH C1 INTO employer2; raise info 'employer name: % , epno: %', employer2.name, employer2.epno; CLOSE C1; RETURN employer.name; END; $$ LANGUAGE plpgsql; --调用该函数。 gaussdb=# CALL regress_record('abc'); --删除函数。 gaussdb=# DROP FUNCTION regress_record; --函数表达式return record示例(必须打开兼容性参数proc_outparam_override) set behavior_compat_options = 'proc_outparam_override'; create or replace package pkg is type rec_type is record(c1 int, c2 int); function test1(col1 out int,col2 out int) return rec_type; end pkg; / create or replace package body pkg as function test1(col1 out int, col2 out int) return rec_type is r rec_type; begin r.c1:=300; r.c2:=400; col1:=100; col2:=200; return r; end; end pkg; / declare res pkg.rec_type:=pkg.rec_type(); a int; b int; begin res:=pkg.test1(a,b); raise info 'a: %, b: %',a,b; raise info '%', res; end; / -- 打开兼容性参数proc_outparam_override时,返回已定义的record类型,函数可以不需out参数 create type rec_type is (c1 int, c2 int); create or replace function func(a in int) return rec_type as declare r rec_type; begin r.c1:=1; r.c2:=2; return r; end; / call func(0); -- 打开兼容性参数proc_outparam_override时,函数直接返回未定义的record类型时,至少需要带有一个out参数 create or replace function func(a in int) return record as declare type rc is record(c1 int); r rc; begin r.c1:=1; a:=1; return r; end; / call func(1);
  • 带索引的集合类型 该集合类型将下标和对应成员值以键值对的方式存储在HASH表中,对该类型变量的所有操作实际就是对HASH表的操作。用户无需自行扩展或释放存储空间,仅需通过赋值或delete方式进行存储和删除成员。集合相关操作、说明如下: 类型定义 索引集合类型定义需同时指定成员类型data_type和下标类型indexby_type,其中下标类型仅支持integer和varchar。 变量声明和初始化 索引集合类型声明后存在3种初始化场景:未初始化、初始化为空、初始化指定下标和成员值。其中未初始化和初始化为空场景对变量的效果一致。未初始化或初始化为空后变量不为NULL,后续都可以对变量直接进行赋值。初始化指定下标和成员值场景会将指定的下标和成员值以键值对的形式保存到变量中。 变量赋值 索引集合类型变量赋值分为两种:成员赋值和整体赋值。成员赋值可通过指定下标方式对某个成员赋值,若该成员不存在则直接赋值,若存在则刷新该成员值。整体赋值则会将被赋值变量中原有成员都清空后重新保存新的成员值。整体赋值场景不能给变量赋NULL值,否则报错。 变量取值 通过指定下标方式可获取变量中对应下标的成员值,若通过下标找不到该成员则会返回no data found的错误信息。 非兼容A模式下(参数sql_compatibility值不为A),不支持创建带索引集合类型。 支持在匿名块、存储过程、自定义函数、package中定义带索引集合类型,其作用域各不相同。不支持在schema中定义带索引集合类型。 NOT NULL只支持语法不支持功能。 当data_type为varchar、numeric等可以定义长度和精度的类型时,要校验集合的元素长度或者将元素转换成对应的精度,需要开启tableof_elem_constraints参数。 data_type为数组类型时,数组类型的元素长度校验或精度转换也受参数tableof_elem_constraints是否开启影响。 通过数组类型转换成的集合类型的值不支持对元素长度校验或精度转换。 data_type可以为基础数据类型,或存储过程内定义的record类型,集合类型,数组类型,不支持ref cursor类型。 indexby_type仅支持integer和varchar。 indexby_type为varchar时,开启参数tableof_elem_constraints后在对带索引集合类型赋值时会校验index值的长度,校验行为不受char_coerce_compat参数是否开启影响,index长度大于定义长度则报错;不开启参数tableof_elem_constraints则不会对索引值进行长度校验。 未初始化的带索引集合类型变量非NULL。 带索引集合类型变量不能赋NULL值,否则报错。 带索引集合类型变量作为入参不能赋NULL值或''。 不同的带索引集合类型的变量不能相互赋值。即使成员类型和下标类型相同,但集合类型名称不同,也是不同的集合类型。如 TYPE t1 IS TABLE OF int index by int; 和 TYPE t2 IS TABLE OF int index by int; 定义的两个集合类型,t1和t2是不同的集合类型,以其定义的变量不支持相互赋值(作为成员类型时该约束不保证生效,赋值逻辑受父类型影响)。 带索引集合类型不支持关系运算和算数运算操作。 select ... bulk collect into 方式赋值带索引集合类型变量时,只支持下标为integer类型的集合类型,下标为varchar类型集合不支持。 支持带索引集合类型变量作为函数的参数和返回值,此时要求参数或者返回值的类型是在package中定义的集合类型。 带索引的集合作为函数入参时,可以传入对应子元素类型相同的数组类型作为入参,不支持多维数组,不支持索引类型为varchar(过时的方法,不建议使用该功能。可执行“set behavior_compat_options = 'disable_rewrite_nesttable';”禁用)。 类型构造器目前仅支持集合类型,其参数个数的上限与用户自定义函数参数个数上限相同。对于带索引的集合类型,构造器在使用时索引的值仅支持为常量。 不支持对XML类型数据操作。 集合类型以及嵌套集合的类型不支持作为表中的一列来创建表。 集合类型的构造器不支持浮点数以及表达式作为下标。 在匿名块中定义的集合类型,匿名块执行ROLLBACK或发生EXCEPTION后,集合类型将无法继续使用。
  • 集合MULTISET函数 MULTISET UNION [ALL | DISTINCT] 参数:nesttable类型 返回值:nesttable类型 功能描述:两个集合变量的并集,ALL不去除重复元素,DISTINCT去除重复元素。 示例: gaussdb=# declare gaussdb-# type nest is table of int; gaussdb-# a nest := nest(1,2); gaussdb-# b nest := nest(2,3); gaussdb-# begin gaussdb$# a := a MULTISET UNION ALL b; gaussdb$# raise info '%', a; gaussdb$# end; gaussdb$# / INFO: {1,2,2,3} ANONYMOUS BLOCK EXECUTE gaussdb=# declare gaussdb-# type nest is table of int; gaussdb-# a nest := nest(1,2); gaussdb-# b nest := nest(2,3); gaussdb-# begin gaussdb$# a := a MULTISET UNION DISTINCT b; gaussdb$# raise info '%', a; gaussdb$# end; gaussdb$# / INFO: {1,2,3} ANONYMOUS BLOCK EXECUTE MULTISET EXCEPT [ALL | DISTINCT] 参数:nesttable类型 返回值:nesttable类型 功能描述:两个集合变量的差集。如A MULTISET EXCEPT B:ALL表示去除A中与B重复的元素;DISTINCT表示先对A进行去重操作,然后去除与B中有重复的元素。 示例: gaussdb=# declare gaussdb-# type nest is table of int; gaussdb-# a nest := nest(1,2,2); gaussdbs-# b nest := nest(2,3); gaussdb-# begin gaussdb$# a := a MULTISET EXCEPT ALL b; gaussdb$# raise info '%', a; gaussdb$# end; gaussdb$# / INFO: {1,2} ANONYMOUS BLOCK EXECUTE gaussdb=# declare gaussdb-# type nest is table of int; gaussdb-# a nest := nest(1,2,2); gaussdb-# b nest := nest(2,3); gaussdb-# begin gaussdb$# a := a MULTISET EXCEPT DISTINCT b; gaussdb$# raise info '%', a; gaussdb$# end; gaussdb$# / INFO: {1} ANONYMOUS BLOCK EXECUTE MULTISET INTERSECT [ALL | DISTINCT] 参数:nesttable类型 返回值:nesttable类型 功能描述:两个集合变量的交集。如 A MULTISET INTERSECT B:ALL表是取A与B所有重复的元素;DISTINCT表示取A与B中重复元素,且去除重复元素。 示例: gaussdb=# declare gaussdb-# type nest is table of int; gaussdb-# a nest := nest(1,2,2); gaussdbs-# b nest := nest(2,2,3); gaussdb-# begin gaussdb$# a := a MULTISET INTERSECT ALL b; gaussdb$# raise info '%', a; gaussdb$# end; gaussdb$# / INFO: {2,2} ANONYMOUS BLOCK EXECUTE gaussdb=# declare gaussdb-# type nest is table of int; gaussdb-# a nest := nest(1,2,2); gaussdb-# b nest := nest(2,2,3); gaussdb-# begin gaussdb$# a := a MULTISET INTERSECT DISTINCT b; gaussdb$# raise info '%', a; gaussdb$# end; gaussdb$# / INFO: {2} ANONYMOUS BLOCK EXECUTE
  • generate_series(start, stop, step) 描述:生成一个数值序列,从start到stop,步长为step。 参数类型:int、bigint、numeric 返回值类型:setof int、setof bigint、setof numeric(与参数类型相同) 示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 SELECT * FROM generate_series(5,1,-2); generate_series ----------------- 5 3 1 (3 rows) SELECT * FROM generate_series(4,6,-5); generate_series ----------------- (0 rows) SELECT * FROM generate_series(4,3,0); ERROR: step size cannot equal zero
  • generate_series(start, stop) 描述:生成一个数值序列,从start到stop,步长默认为1。 参数类型:int、bigint、numeric 返回值类型:setof int、setof bigint、setof numeric(与参数类型相同) 示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 SELECT * FROM generate_series(2,4); generate_series ----------------- 2 3 4 (3 rows) SELECT * FROM generate_series(4,3); generate_series ----------------- (0 rows) SELECT * FROM generate_series(1,NULL); generate_series ----------------- (0 rows)
  • generate_series(start, stop, step interval) 描述:生成一个数值序列,从start到stop,步长为step。 参数类型:timestamp或timestamp with time zone 返回值类型:setof timestamp或setof timestamp with time zone(与参数类型相同) 示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 --这个示例应用于date-plus-integer操作符。 SELECT current_date + s.a AS dates FROM generate_series(0,14,7) AS s(a); dates ------------ 2017-06-02 2017-06-09 2017-06-16 (3 rows) SELECT * FROM generate_series('2008-03-01 00:00'::timestamp, '2008-03-04 12:00', '10 hours'); generate_series --------------------- 2008-03-01 00:00:00 2008-03-01 10:00:00 2008-03-01 20:00:00 2008-03-02 06:00:00 2008-03-02 16:00:00 2008-03-03 02:00:00 2008-03-03 12:00:00 2008-03-03 22:00:00 2008-03-04 08:00:00 (9 rows)
  • 响应示例 状态码: 201 处理成功返回。 { "group_collection_id" : "f9b045e0811c482f9de0d436a5927bb6" } 状态码: 400 处理失败返回。 { "error_code" : "VOD.10053", "error_msg" : "The request parameter is illegal, illegal field: {xx}." }
  • 请求参数 表2 请求Header参数 参数 是否必选 参数类型 描述 X-Auth-Token 否 String 用户Token,使用Token鉴权方式时必选。 通过调用IAM服务获取用户Token接口获取(响应消息头中X-Subject-Token的值)。 Authorization 否 String 使用AK/SK方式认证时必选,携带的鉴权信息。 X-Sdk-Date 否 String 使用AK/SK方式认证时必选,请求的发生时间。 表3 请求Body参数 参数 是否必选 参数类型 描述 name 是 String 模板组集合名称 description 否 String 模板组集合描述 template_group_list 是 Array of strings 模板组列表,模板ID
  • 请求示例 创建转码模板集合 POST https://{endpoint}/v1.0/{project_id}/asset/template-collection/transcodings Content-Type: application/json { "name": "test", "template_group_list": [ "780640dd1d584a6999b104568c358b78", "6a16d8d0161c42caa42b9c148d032871" ] }
  • 请求参数 表3 请求Header参数 参数 是否必选 参数类型 描述 X-Auth-Token 否 String 用户Token,使用Token鉴权方式时必选。 通过调用IAM服务获取用户Token接口获取(响应消息头中X-Subject-Token的值)。 Authorization 否 String 使用AK/SK方式认证时必选,携带的鉴权信息。 X-Sdk-Date 否 String 使用AK/SK方式认证时必选,请求的发生时间。
  • generate_series(start, stop, step interval) 描述:生成一个数值序列,从start到stop,步长为step。 参数类型:timestamp或timestamp with time zone 返回值类型:setof timestamp或setof timestamp with time zone(与参数类型相同) 示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 --这个示例应用于date-plus-integer操作符。 SELECT current_date + s.a AS dates FROM generate_series(0,14,7) AS s(a); dates ------------ 2017-06-02 2017-06-09 2017-06-16 (3 rows) SELECT * FROM generate_series('2008-03-01 00:00'::timestamp, '2008-03-04 12:00', '10 hours'); generate_series --------------------- 2008-03-01 00:00:00 2008-03-01 10:00:00 2008-03-01 20:00:00 2008-03-02 06:00:00 2008-03-02 16:00:00 2008-03-03 02:00:00 2008-03-03 12:00:00 2008-03-03 22:00:00 2008-03-04 08:00:00 (9 rows)
  • generate_series(start, stop) 描述:生成一个数值序列,从start到stop,步长默认为1。 参数类型:int、bigint、numeric 返回值类型:setof int、setof bigint、setof numeric(与参数类型相同) 示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 SELECT * FROM generate_series(2,4); generate_series ----------------- 2 3 4 (3 rows) SELECT * FROM generate_series(4,3); generate_series ----------------- (0 rows) SELECT * FROM generate_series(1,NULL); generate_series ----------------- (0 rows)
  • generate_series(start, stop, step) 描述:生成一个数值序列,从start到stop,步长为step。 参数类型:int、bigint、numeric 返回值类型:setof int、setof bigint、setof numeric(与参数类型相同) 示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 SELECT * FROM generate_series(5,1,-2); generate_series ----------------- 5 3 1 (3 rows) SELECT * FROM generate_series(4,6,-5); generate_series ----------------- (0 rows) SELECT * FROM generate_series(4,3,0); ERROR: step size cannot equal zero
  • 示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 --演示在存储过程中对数组进行操作。 gaussdb=# CREATE OR REPLACE PROCEDURE array_proc AS DECLARE TYPE ARRAY_INTEGER IS VARRAY(1024) OF INTEGER;--定义数组类型 ARRINT ARRAY_INTEGER := ARRAY_INTEGER(); --声明数组类型的变量 BEGIN ARRINT.EXTEND(10); FOR I IN 1..10 LOOP ARRINT(I) := I; END LOOP; DBE_OUTPUT.PRINT_LINE(ARRINT.COUNT); DBE_OUTPUT.PRINT_LINE(ARRINT(1)); DBE_OUTPUT.PRINT_LINE(ARRINT(10)); DBE_OUTPUT.PRINT_LINE(ARRINT(ARRINT.FIRST)); DBE_OUTPUT.PRINT_LINE(ARRINT(ARRINT.LAST)); DBE_OUTPUT.PRINT_LINE(ARRINT(ARRINT.NEXT(ARRINT.FIRST))); DBE_OUTPUT.PRINT_LINE(ARRINT(ARRINT.PRIOR(ARRINT.LAST))); ARRINT.TRIM(); IF ARRINT.EXISTS(10) THEN DBE_OUTPUT.PRINT_LINE('Exist 10th element'); ELSE DBE_OUTPUT.PRINT_LINE('Not exist 10th element'); END IF; DBE_OUTPUT.PRINT_LINE(ARRINT.COUNT); DBE_OUTPUT.PRINT_LINE(ARRINT(ARRINT.FIRST)); DBE_OUTPUT.PRINT_LINE(ARRINT(ARRINT.LAST)); ARRINT.DELETE(); END; / --调用该存储过程。 gaussdb=# CALL array_proc(); 10 1 10 1 10 2 9 Not exist 10th element 9 1 9 array_proc ------------ (1 row) --删除存储过程。 gaussdb=# DROP PROCEDURE array_proc;
  • 数组类型的使用 在使用数组之前,需要自定义一个数组类型。 在存储过程中紧跟AS关键字后面定义数组类型。定义方法为: TYPE array_type IS VARRAY(size) OF data_type; 其中: array_type:要定义的数组类型名。 VARRAY:表示要定义的数组类型。 size:取值为正整数,表示可以容纳的成员的最大数量。 data_type:要创建的数组中成员的类型。 在GaussDB中,数组会自动增长,访问越界会返回一个NULL,不会报错。 在存储过程中定义的数组类型,其作用域仅在该存储过程中。 size只支持语法,不支持功能。 data_type也可以为存储过程中定义的record类型(匿名块不支持)、集合类型,但不可以为存储过程中定义的数组类型、游标类型。 data_type为集合类型时,不支持使用多维数组。 不支持NOT NULL语法。 array类型的构造器仅支持在ORA兼容模式下使用。 array类型的构造器不支持作为函数或存储过程参数的默认值。 当数组是集合类型的元素并且数组的data_type为varchar、numeric等可以定义长度和精度的类型时,不会校验该数组的元素长度或者将元素转换成对应的精度。 设置enable_recordtype_check_strict参数值为on后,成员是record类型,且record类型有列具有not null属性或defalut属性,在存储过程或PACKAGE编译时会报错。 GaussDB支持使用圆括号来访问数组元素,且还支持一些特有的函数,如extend,count,first,last,prior,next,exists,trim,delete来访问数组的内容。 存储过程中如果有DML语句(SELECT、UPDATE、INSERT、DELETE),DML语句只能使用中括号来访问数组元素,这样可以和函数表达式区分开。