集合支持的函数
集合操作符
- =
返回值:TRUE或FALSE,BOOLEAN类型。
功能描述:判断两个集合是否相等。
示例:
gaussdb=# DECLARE TYPE nest IS TABLE OF INT a nest := nest(1,2); b nest := nest(1,2); flag BOOL; BEGIN flag := a = b; RAISE INFO '%', flag; END; / INFO: t ANONYMOUS BLOCK EXECUTE - <>
返回值:TRUE或FALSE,BOOLEAN类型。
功能描述:判断两个集合是否不相等。
示例:
gaussdb=# DECLARE TYPE nest IS TABLE OF INT; a nest := nest(1,2); b nest := nest(1,2); flag BOOL; BEGIN flag := a <> b; RAISE INFO '%', flag; END; / INFO: f ANONYMOUS BLOCK EXECUTE
- IS [NOT] NULL
返回值:TRUE或FALSE,BOOLEAN类型。
功能描述:IS NULL判断一个集合是否为NULL,IS NOT NULL判断一个集合是否为非NULL。
示例:
gaussdb=# DECLARE TYPE nest IS TABLE OF INT; a nest; b nest := NULL; c nest := nest(1,2); flag BOOL; BEGIN flag := a IS NULL; RAISE INFO '%', flag; flag := b IS NULL; RAISE INFO '%', flag; flag := c IS NULL; RAISE INFO '%', flag; END; / INFO: t INFO: t INFO: f ANONYMOUS BLOCK EXECUTE gaussdb=# DECLARE TYPE nest IS TABLE OF INT; a nest; b nest := NULL; c nest := nest(1,2); flag BOOL; BEGIN flag := a IS NOT NULL; RAISE INFO '%', flag; flag := b IS NOT NULL; RAISE INFO '%', flag; flag := c IS NOT NULL; RAISE INFO '%', flag; END; / INFO: f INFO: f INFO: t ANONYMOUS BLOCK EXECUTE
- ^=
返回值:TRUE或FALSE,BOOLEAN类型。
功能描述:判断两个集合是否不相等。
示例:
gaussdb=# DECLARE TYPE nest IS TABLE OF INT; a nest := nest(1,2); b nest := nest(1,2); flag BOOL; BEGIN flag := a ^= b; RAISE INFO '%', flag; END; / INFO: f ANONYMOUS BLOCK EXECUTE - [NOT] IN
返回值:TRUE或FALSE,BOOLEAN类型。
功能描述:判断一个集合是否在集合列表中。
示例:
gaussdb=# DECLARE TYPE tab IS TABLE OF VARCHAR(10); tmp1 tab := tab('a', 'b'); tmp2 tab := tab('a', 'b'); flag BOOL; BEGIN flag := tmp2 in (tmp1); RAISE INFO '%', flag; END; / INFO: t ANONYMOUS BLOCK EXECUTE
集合MULTISET函数
- MULTISET UNION [ALL | DISTINCT]
返回值:nesttable类型。
功能描述:两个集合变量的并集,ALL表示不去除重复元素,DISTINCT表示去除重复元素,ALL为默认值。
示例1,求两个集合变量的并集,且不去除重复元素,即MULTISET UNION ALL:
gaussdb=# DECLARE TYPE nest IS TABLE OF INT; a nest := nest(1,2); b nest := nest(2,3); BEGIN a := a MULTISET UNION ALL b; RAISE INFO '%', a; end; / INFO: {1,2,2,3} ANONYMOUS BLOCK EXECUTE示例2,求两个集合变量的并集,且去除重复元素,即MULTISET UNION DISTINCT:
gaussdb=# DECLARE TYPE nest IS TABLE OF INT; a nest := nest(1,2); b nest := nest(2,3); BEGIN a := a MULTISET UNION DISTINCT b; RAISE INFO '%', a; END; / INFO: {1,2,3} ANONYMOUS BLOCK EXECUTE - MULTISET EXCEPT [ALL | DISTINCT]
返回值:nesttable类型。
功能描述:两个集合变量的差集。如A MULTISET EXCEPT B:ALL表示去除A中A具有的元素且B也具有的元素并返回,其中去除动作计算元素个数。例如,对于特定元素,如果A中出现了m次,B中出现了n次,当 m > n时,则去除A中m - n个该元素,当m <= n时,则去除A中m个该元素;DISTINCT表示去除A中A具有的元素且B也具有的元素并返回,其中去除动作不计算元素个数。对于特定元素,如果在A中出现且又在B中出现了,则去除A中所有该元素。ALL为默认值。
示例1,求两个集合变量的差集,去除A中A具有的元素且B也具有的元素并返回,其中去除动作计算元素个数。即MULTISET EXCEPT ALL:
gaussdb=# DECLARE TYPE nest IS TABLE OF INT; a nest := nest(1,2,2); b nest := nest(2,3); BEGIN a := a MULTISET EXCEPT ALL b; RAISE INFO '%', a; END; / INFO: {1,2} ANONYMOUS BLOCK EXECUTE示例2,求两个集合变量的差集,去除A中A具有的元素且B也具有的元素并返回,其中去除动作不计算元素个数。即MULTISET EXCEPT DISTINCT:
gaussdb=# DECLARE TYPE nest IS TABLE OF INT; a nest := nest(1,2,2); b nest := nest(2,3); BEGIN a := a MULTISET EXCEPT DISTINCT b; RAISE INFO '%', a; END; / INFO: {1} ANONYMOUS BLOCK EXECUTE - MULTISET INTERSECT [ALL | DISTINCT]
返回值:nesttable类型。
功能描述:两个集合变量的交集。如 A MULTISET INTERSECT B:ALL表示保留所有重复元素(包括多次重复的元素);DISTINCT表示返回唯一值交集,去除重复元素。ALL为默认值。
示例1,求两个集合变量的交集,不去除重复元素,即MULTISET INTERSECT ALL:
gaussdb=# DECLARE TYPE nest IS TABLE OF INT; a nest := nest(1,2,2); b nest := nest(2,2,3); BEGIN a := a MULTISET INTERSECT ALL b; RAISE INFO '%', a; END; / INFO: {2,2} ANONYMOUS BLOCK EXECUTE示例2,求两个集合变量的交集,去除重复元素,即MULTISET INTERSECT DISTINCT:
gaussdb=# DECLARE TYPE nest IS TABLE OF INT; a nest := nest(1,2,2); b nest := nest(2,2,3); BEGIN a := a MULTISET INTERSECT DISTINCT b; RAISE INFO '%', a; END; / INFO: {2} ANONYMOUS BLOCK EXECUTE
集合类型函数
- 以下函数定义说明里[]中的内容代表可选项,如count[()]表示可以写成count或count()。
- 在内层表达式中,不支持通过嵌套的方式调用集合类型函数。
- 当类型嵌套且集合类型作为内部类型时,无参的extend、delete、trim函数只支持extend、delete、trim形式调用,不支持extend()、delete()、trim()形式调用。
- exists(idx)
返回值:TRUE或FALSE,BOOLEAN类型。
功能描述:查找指定位置是否存在有效元素。
示例:
gaussdb=# DECLARE TYPE nest IS TABLE OF VARCHAR2; a nest := nest('happy','?'); flag BOOL; BEGIN flag := a.EXISTS(1); RAISE INFO '%', flag; flag := a.EXISTS(10); RAISE INFO '%', flag; END; / INFO: t INFO: f ANONYMOUS BLOCK EXECUTE gaussdb=# DECLARE TYPE nest IS TABLE OF VARCHAR2 INDEX BY VARCHAR2; a nest; flag BOOL; BEGIN a('1') := 'Be'; a('2') := 'happy'; a('3') := '.'; flag := a.EXISTS('1'); RAISE INFO '%', flag; flag := a.EXISTS('ddd'); RAISE INFO '%', flag; END; / INFO: t INFO: f ANONYMOUS BLOCK EXECUTE
- extend[(count[, idx])]
参数:idx和count为INT4类型,没有参数传入时扩展1个元素值为NULL。
返回值:无返回值。
功能描述:extend函数仅支持nesttable类型变量使用。在nesttable变量末尾拓展1个或count个元素。存在idx下标元素时,复制count个idx下标元素到变量末尾。
示例1,nesttable类型变量扩展1个元素且所扩展的元素值为NULL:
gaussdb=# DECLARE TYPE nest IS TABLE OF INT; a nest := nest(1); BEGIN RAISE INFO '%', a; a.EXTEND; RAISE INFO '%', a; a.EXTEND; RAISE INFO '%', a; END; / INFO: {1} INFO: {1,NULL} INFO: {1,NULL,NULL} ANONYMOUS BLOCK EXECUTE示例2,nesttable类型变量扩展n个元素且所扩展的元素值为NULL:
gaussdb=# DECLARE TYPE nest IS TABLE OF INT; a nest := nest(1); BEGIN RAISE INFO '%', a; a.EXTEND(2); RAISE INFO '%', a; END; / INFO: {1} INFO: {1,NULL,NULL} ANONYMOUS BLOCK EXECUTE示例3,nesttable类型变量扩展n个元素且所扩展的元素值为指定下标元素的值:
gaussdb=# DECLARE TYPE nest IS TABLE OF INT; a nest := nest(9); BEGIN RAISE INFO '%', a; a.EXTEND(2,1); RAISE INFO '%', a; END; / INFO: {9} INFO: {9,9,9} ANONYMOUS BLOCK EXECUTE - delete[(idx1[, idx2])]
参数:idx1和idx2为INT4类型或VARCHAR2类型。
返回值:无返回值。
功能描述:无参数时,无索引集合nesttable类型变量删除集合类型的所有元素和空间,后续使用需要重新扩展空间,带索引集合indexbytable类型变量删除所有元素内容;一个参数删除指定位置元素(不删除空间);两个参数则删除下标区间内的所有元素(不删除空间)。
约束:对于无索引集合nesttable类型来说,删除元素而没删除空间,会使该空间处于无效状态,可继续赋值。作为函数返回值或自治事务入参时,会删除无效成员的存储空间,所有成员的下标会相应发生改变。
示例1,无索引集合nesttable类型变量删除集合类型的所有元素和空间:
gaussdb=# DECLARE TYPE nest IS TABLE OF INT; a nest := nest(1,2,3,4,5); BEGIN RAISE INFO '%', a; a.DELETE(); RAISE INFO '%', a; END; / INFO: {1,2,3,4,5} INFO: {} ANONYMOUS BLOCK EXECUTE示例2,无索引集合nesttable类型变量删除指定位置元素:
gaussdb=# DECLARE TYPE nest IS TABLE OF INT; a nest := nest(1,2,3,4,5); BEGIN RAISE INFO '%', a; a.DELETE(3); RAISE INFO '%', a; a(3) := 3; RAISE INFO '%', a; END; / INFO: {1,2,3,4,5} INFO: {1,2,4,5} INFO: {1,2,3,4,5} ANONYMOUS BLOCK EXECUTE示例3,无索引集合nesttable类型变量删除指定区间元素:
gaussdb=# DECLARE TYPE nest IS TABLE OF INT; a nest := nest(1,2,3,4,5); BEGIN RAISE INFO '%', a; a.DELETE(2,4); RAISE INFO '%', a(1); RAISE INFO '%', a(5); RAISE INFO '%', a; END; / INFO: {1,2,3,4,5} INFO: 1 INFO: 5 INFO: {1,5} ANONYMOUS BLOCK EXECUTE示例4,带索引集合indexbytable类型变量删除集合类型的所有元素和空间:
gaussdb=# DECLARE TYPE t1 IS TABLE OF INT INDEX BY VARCHAR; v t1 := t1('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4); BEGIN v.DELETE(); RAISE INFO '%', v.COUNT(); END; / INFO: 0 ANONYMOUS BLOCK EXECUTE示例5,带索引集合indexbytable类型变量删除指定位置元素:
gaussdb=# declare type t1 is table of int index by varchar; v t1 := t1('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4); begin raise info '%', v('a'); v.delete('a'); raise info '%', v('a'); end; / INFO: 1 ERROR: no data found CONTEXT: PL/pgSQL function inline_code_block line 6 at RAISE示例6,带索引集合indexbytable类型变量删除指定区间元素:
gaussdb=# declare type t1 is table of int index by varchar; v t1 := t1('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4); begin raise info '%', v('b'); v.delete('a', 'c'); raise info '%', v('b'); end; / INFO: 2 ERROR: no data found CONTEXT: PL/pgSQL function inline_code_block line 6 at RAISE - trim[(n)]
返回值:无返回值。
功能描述:trim函数仅支持nesttable类型变量使用。无参数时,删除末尾一个元素空间,输入参数合法时,删除末尾指定数量元素空间。
示例:
gaussdb=# DECLARE TYPE nest IS TABLE OF INT; aa nest := nest(11,22,33,44,55); BEGIN RAISE INFO 'aa:%' ,aa; aa.TRIM; -- 无参数 RAISE INFO 'aa:%' ,aa; aa.TRIM(); -- 无参数 RAISE INFO 'aa:%' ,aa; aa.TRIM(2); -- 参数合法 RAISE INFO 'aa:%' ,aa; aa.TRIM(2); -- 集合元素空间不足2, 参数不合法报错 END; / INFO: aa:{11,22,33,44,55} INFO: aa:{11,22,33,44} INFO: aa:{11,22,33} INFO: aa:{11} ERROR: Subscript beyond count CONTEXT: PL/pgSQL function inline_code_block line 11 at assignment - count[()]
返回值:INT类型。
功能描述:返回集合中存在有效元素的个数。
示例1,无索引集合类型变量使用count函数:
gaussdb=# DECLARE TYPE nest IS TABLE OF INT; aa nest:=nest(11,22,33,44,55); BEGIN RAISE INFO 'count:%' ,aa.COUNT; aa.DELETE(3); -- 删除一个元素,下标为3的元素无效 RAISE INFO 'count:%' ,aa.COUNT(); END; / INFO: count:5 INFO: count:4 ANONYMOUS BLOCK EXECUTE示例2,带索引集合类型变量使用count函数:
gaussdb=# DECLARE TYPE t1 IS TABLE OF INT INDEX BY INT; aa t1; BEGIN aa(1) := 111; aa(2) := 222; aa(3) := 333; RAISE INFO 'count:%' ,aa.COUNT(); END; / INFO: count:3 ANONYMOUS BLOCK EXECUTE gaussdb=# DECLARE TYPE t1 IS TABLE OF INT INDEX BY INT; aa t1; BEGIN aa(1) := 111; aa(2) := 222; aa(3) := 333; RAISE INFO 'count:%' ,aa.COUNT(); END; / INFO: count:3 ANONYMOUS BLOCK EXECUTE
- first[()]
返回值:INT类型或VARCHAR类型。
功能描述:返回集合中第一个有效元素的下标。
示例1,无索引集合类型变量使用first函数:
gaussdb=# DECLARE TYPE nest IS TABLE OF INT; aa nest:=nest(11,22,33,44,55); BEGIN RAISE INFO 'first:%' ,aa.FIRST(); aa.DELETE(1); RAISE INFO 'first:%' ,aa.FIRST; -- 下标1的元素无效,第一个有效元素下标为2 END; / INFO: first:1 INFO: first:2 ANONYMOUS BLOCK EXECUTE示例2,带索引集合类型变量使用first函数:
gaussdb=# DECLARE TYPE t1 IS TABLE OF INT INDEX BY INT; aa t1; BEGIN aa(3) := 111; aa(2) := 222; aa(1) := 333; RAISE INFO 'first:%' ,aa.FIRST; END; / INFO: first:1 ANONYMOUS BLOCK EXECUTE gaussdb=# DECLARE TYPE t1 IS TABLE OF INT INDEX BY VARCHAR; aa t1; BEGIN aa('aaa') := 111; aa('bbb') := 222; aa('ccc') := 333; RAISE INFO 'first:%' ,aa.FIRST; END; / INFO: first:aaa ANONYMOUS BLOCK EXECUTE
- last[()]
返回值:INT类型或VARCHAR类型。
功能描述:返回集合中最后一个有效元素的下标。
示例1,无索引集合类型变量使用last函数:
gaussdb=# DECLARE TYPE nest IS TABLE OF INT; aa nest:=nest(11,22,33,44,55); BEGIN RAISE INFO 'last:%' ,aa.LAST; aa.DELETE(5); RAISE INFO 'last:%' ,aa.LAST(); -- 下标5的元素无效,最后一个有效元素下标为4 END; / INFO: last:5 INFO: last:4 ANONYMOUS BLOCK EXECUTE示例2,带索引集合类型变量使用last函数:
gaussdb=# DECLARE TYPE t1 IS TABLE OF INT INDEX BY VARCHAR; aa t1; BEGIN aa(3) := 111; aa(2) := 222; aa(1) := 333; RAISE INFO 'last:%' ,aa.LAST(); END; / INFO: last:3 ANONYMOUS BLOCK EXECUTE gaussdb=# DECLARE TYPE t1 IS TABLE OF INT INDEX BY VARCHAR; aa t1; BEGIN aa(3) := 111; aa(2) := 222; aa(1) := 333; RAISE INFO 'last:%' ,aa.LAST(); END; / INFO: last:ccc ANONYMOUS BLOCK EXECUTE
- prior(idx)
返回值:int类型或varchar类型。
功能描述:返回集合中给定下标的前一个有效元素下标,下标不存在返回集合中最后一个元素。
示例1,无索引集合类型变量使用prior函数:
gaussdb=# DECLARE TYPE nest IS TABLE OF INT; aa nest:=nest(11,22,33,44,55); BEGIN RAISE INFO 'prior:%' ,aa.PRIOR(3); END; / INFO: prior:2 ANONYMOUS BLOCK EXECUTE示例2,带索引集合类型变量使用prior函数:
gaussdb=# DECLARE TYPE t1 IS TABLE OF INT INDEX BY VARCHAR; aa t1; BEGIN aa('ccc') := 111; aa('bbb') := 222; aa('aaa') := 333; RAISE INFO 'prior:%' ,aa.PRIOR('bbb'); RAISE INFO 'prior:%' ,aa.PRIOR('ddd'); END; / INFO: prior:aaa INFO: prior:ccc ANONYMOUS BLOCK EXECUTE - next(idx)
参数:idx为INT类型或VARCHAR类型,下标不存在返回集合中第一个元素。
返回值:INT类型或VARCHAR类型。
功能描述:返回集合中给定下标的后一个有效元素下标。
示例1,无索引集合类型变量使用next函数:
gaussdb=# DECLARE TYPE nest IS TABLE OF INT; aa nest:=nest(11,22,33,44,55); BEGIN RAISE INFO 'next:%' ,aa.NEXT(3); END; / INFO: next:4 ANONYMOUS BLOCK EXECUTE示例2,带索引集合类型变量使用next函数:
gaussdb=# DECLARE TYPE t1 IS TABLE OF INT INDEX BY INT; aa t1; BEGIN aa(3) := 111; aa(2) := 222; aa(1) := 333; RAISE INFO 'next:%' ,aa.NEXT(2); RAISE INFO 'next:%' ,aa.NEXT(-999); END; / INFO: next:3 INFO: next:1 ANONYMOUS BLOCK EXECUTE - limit
返回值:NULL。
功能描述:仅用于nesttable类型变量,且返回NULL值。
示例:
gaussdb=# DECLARE TYPE nest IS TABLE OF INT; aa nest:=nest(11,22,33,44,55); BEGIN RAISE INFO 'limit:%' ,aa.LIMIT; END; / INFO: limit:<NULL> ANONYMOUS BLOCK EXECUTE
集合相关函数
- unnest_table(anynesttable)或unnest(anynesttable)
描述:返回给定nesttable中所有有效元素的结果集,会返回多行数据。
返回类型:setof anyelement。
示例:
-- 当集合的元素类型为record类型且有元素为NULL时,该元素不会被返回,而是会返回一个非NULL的record值,该record的所有列为NULL。 gaussdb=# CREATE OR REPLACE p1() gaussdb-# AS gaussdb$# TYPE t1 IS TABLE OF INT; gaussdb$# v2 t1 := t1(NULL, 2, 3, 4, NULL); gaussdb$# tmp INT; gaussdb$# CURSOR c1 IS SELECT * FROM UNNEST_TABLE(v2); gaussdb$# BEGIN gaussdb$# OPEN c1; gaussdb$# FOR i IN 1 .. v2.COUNT LOOP gaussdb$# FETCH c1 INTO tmp; gaussdb$# IF tmp IS NULL THEN gaussdb$# DBE_OUTPUT.PRINT_LINE(i || ': is null'); gaussdb$# ELSE gaussdb$# DBE_OUTPUT.PRINT_LINE(i || ': ' || tmp); gaussdb$# END IF; gaussdb$# END LOOP; gaussdb$# CLOSE c1; gaussdb$# END; gaussdb$# / CREATE PROCEDURE gaussdb=# CALL p1(); 1: is null 2: 2 3: 3 4: 4 5: is null p1 ---- (1 row) gaussdb=# DROP PROCEDURE IS EXISTS p1(); DROP PROCEDURE -- nesttable嵌套record类型示例 gaussdb=# CREATE OR REPLACE PROCEDURE p1() IS gaussdb$# TYPE rec IS RECORD(c1 INT, c2 INT); gaussdb$# TYPE t1 IS TABLE OF rec; gaussdb$# v t1 := t1(rec(1, 1), rec(2, NULL), rec(NULL, NULL), NULL); gaussdb$# v2 t1 := t1(); gaussdb$# CURSOR cur IS SELECT * FROM UNNEST(v); gaussdb$# BEGIN gaussdb$# v2.EXTEND(v.COUNT); gaussdb$# OPEN cur; gaussdb$# FOR i IN 1 .. v.COUNT LOOP gaussdb$# FETCH cur INTO v2(i); gaussdb$# RAISE INFO '%', v2(i); gaussdb$# END LOOP; gaussdb$# CLOSE cur; gaussdb$# END gaussdb$# / CREATE PROCEDURE gaussdb=# CALL p1(); INFO: (1,1) INFO: (2,) INFO: (,) INFO: (,) p1 ---- (1 row) gaussdb=# DROP PROCEDURE IF EXISTS p1(); DROP PROCEDURE
- unnest_table(anyindexbytable)或unnest(anyindexbytable)
描述:返回给定indexbytable中所有元素根据索引排序后的结果集,会返回多行数据。
返回类型:setof anyelement
约束:只支持INDEX BY INT类型。
示例:
-- 当集合的元素类型为record类型且有元素为NULL时,该元素不会被返回,而是会返回一个非NULL的record值,该record的所有列为NULL。 gaussdb=# CREATE OR REPLACE PROCEDURE p1() gaussdb-# AS gaussdb$# TYPE t1 IS TABLE OF INT INDEX BY INT; gaussdb$# v2 t1 := t1(1=>1, -10=>(-10), 6=>6, 4=>NULL); gaussdb$# tmp INT; gaussdb$# CURSOR c1 IS SELECT * FROM UNNEST_TABLE(v2); gaussdb$# BEGIN gaussdb$# OPEN c1; gaussdb$# FOR i IN 1 .. v2.COUNT LOOP gaussdb$# FETCH c1 INTO tmp; gaussdb$# IF tmp IS NULL THEN gaussdb$# DBE_OUTPUT.PRINT_LINE(i || ': is null'); gaussdb$# ELSE gaussdb$# DBE_OUTPUT.PRINT_LINE(i || ': ' || tmp); gaussdb$# END IF; gaussdb$# END LOOP; gaussdb$# CLOSE c1; gaussdb$# END; gaussdb$# / CREATE PROCEDURE gaussdb=# CALL p1(); 1: -10 2: 1 3: is null 4: 6 p1 ---- (1 row) gaussdb=# DROP PROCEDURE IF EXISTS p1(); DROP PROCEDURE -- index by table嵌套record类型示例 gaussdb=# CREATE OR REPLACE PROCEDURE p1() IS gaussdb$# TYPE rec IS RECORD(c1 INT, c2 INT); gaussdb$# TYPE t1 IS TABLE OF rec INDEX BY INT; gaussdb$# v t1 := t1(1 => rec(1, 1), 2 => rec(2, NULL), 3 => rec(NULL, NULL), 4 => NULL); gaussdb$# v2 t1 := t1(); gaussdb$# CURSOR cur IS SELECT * FROM UNNEST(v); gaussdb$# BEGIN gaussdb$# OPEN cur; gaussdb$# FOR i IN 1 .. v.COUNT LOOP gaussdb$# FETCH cur INTO v2(i); gaussdb$# RAISE INFO '%', v2(i); gaussdb$# END LOOP; gaussdb$# CLOSE cur; gaussdb$# END; gaussdb$# / CREATE PROCEDURE gaussdb=# CALL p1(); INFO: (1,1) INFO: (2,) INFO: (,) INFO: (,) p1 ---- (1 row) gaussdb=# drop procedure if exists p1(); DROP PROCEDURE