云数据库 GaussDB-CREATE FUNCTION:示例

时间:2025-02-12 15:06:01

示例

  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 99100101102103104105106107108109110111112113114115116
--创建一个兼容性为ORA的数据库。gaussdb=# CREATE DATABASE ora_compatible_db DBCOMPATIBILITY 'ORA';CREATE DATABASE--切换数据库gaussdb=# \c ora_compatible_db--定义函数为SQL查询。gaussdb=# CREATE FUNCTION func_add_sql(integer, integer) RETURNS integer    AS 'select $1 + $2;'    LANGUAGE SQL    IMMUTABLE    RETURNS NULL ON NULL INPUT;--利用参数名用 plpgsql 自增一个整数。gaussdb=# CREATE OR REPLACE FUNCTION func_increment_plsql(i integer) RETURNS integer AS $$        BEGIN                RETURN i + 1;        END;$$ LANGUAGE plpgsql;--返回一个包含多个输出参数的记录。gaussdb=# CREATE FUNCTION func_dup_sql(in int, out f1 int, out f2 text)    AS $$ SELECT $1, CAST($1 AS text) || ' is text' $$    LANGUAGE SQL;gaussdb=# SELECT * FROM func_dup_sql(42);--计算两个整数的和,并返回结果。如果输入为null,则返回null。gaussdb=# CREATE FUNCTION func_add_sql2(num1 integer, num2 integer) RETURN integerASBEGIN RETURN num1 + num2;END;/--修改函数add的执行规则为IMMUTABLE,即参数不变时返回相同结果。gaussdb=# ALTER FUNCTION func_add_sql2(INTEGER, INTEGER) IMMUTABLE;--将函数add的名称修改为add_two_number。gaussdb=# ALTER FUNCTION func_add_sql2(INTEGER, INTEGER) RENAME TO add_two_number;--将函数add的属者改为omm。gaussdb=# ALTER FUNCTION add_two_number(INTEGER, INTEGER) OWNER TO omm;--删除函数。gaussdb=# DROP FUNCTION add_two_number;gaussdb=# DROP FUNCTION func_increment_sql;gaussdb=# DROP FUNCTION func_dup_sql;gaussdb=# DROP FUNCTION func_increment_plsql;gaussdb=# DROP FUNCTION func_add_sql;--不打开参数set behavior_compat_options = 'proc_outparam_override'时,被匿名块或存储过程直接调用的函数的OUT,并且RETURN值会被当做OUT出参的第一个值导致调用失败。gaussdb=# CREATE TYPE rec AS(c1 int, c2 int);gaussdb=# CREATE OR REPLACE FUNCTION func(a in out rec, b in out int) return intASBEGIN  a.c1:=100;  a.c2:=200;  b:=300;  return 1;END;/DECLARE  r rec;  b int;BEGIN  func(r,b);  --不支持。END;/ERROR:  cannot assign non-composite value to a row variableCONTEXT:  PL/SQL function inline_code_block line 4 at SQL statementgaussdb=# CREATE OR REPLACE FUNCTION func_001(a in out date, b in out date) --#add in & inout #defult valueRETURN integerASBEGIN    raise info '%', a;    raise info '%', b;RETURN 1;END;/gaussdb=# DECLARE    date1 date := '2022-02-02';    date2 date := '2022-02-02';BEGIN    func_001(date1, date2);END;/INFO:  2022-02-02 00:00:00CONTEXT:  PL/SQL function inline_code_block line 5 at SQL statementINFO:  2022-02-02 00:00:00CONTEXT:  PL/SQL function inline_code_block line 5 at SQL statementERROR:  invalid input syntax for type timestamp: "1"CONTEXT:  PL/SQL function inline_code_block line 5 at SQL statementgaussdb=# CREATE OR REPLACE FUNCTION func_001(a in out INT, b in out date) --#add in & inout #defult valueRETURN INTASBEGIN    raise info '%', a;    raise info '%', b;RETURN a;END;/gaussdb=# DECLARE    date1 int := 1;    date2 date := '2022-02-02';BEGIN    func_001(date1, date2);END;/INFO:  1CONTEXT:  PL/SQL function inline_code_block line 5 at SQL statementINFO:  2022-02-02 00:00:00CONTEXT:  PL/SQL function inline_code_block line 5 at SQL statementANONYMOUS BLOCK EXECUTE
support.huaweicloud.com/distributed-devg-v3-gaussdb/gaussdb-12-0519.html