暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

人大金仓数据库KingbaseES --PLSQL函数

数据猿 2023-12-06
1495


关键字:

Function、人大金仓、KingbaseES

Function介绍

在PLSQL中,函数(function)是一种独立的命名代码块,用于接收输入参数并返回值,函数可以在SQL语句、PLSQL块或者其他函数中调用,用于执行特定的操作并返回结果。其语法结构如下:

CREATE [OR REPLACE] FUNCTION function_name

[(parameter[IN|OUT|IN OUT] type [, …])]

RETURN return_datatype (IS|AS)

BEGIN

<function_body>

END;

例子:

\set SQLTERM /

create or replace function sum_number (f1 number,f2 number)

return number

is

sum number;

begin

sum:=f1+f2;

return sum;

end;

/

\set SQLTERM ;

select sum_number(1,2);

Function的return语句

本文列举了plsql中四种不同形式的return用于函数的返回结果:return ,return query,return next,return query execute;其中return用于返回单个值,也可以是一个复杂类型的值,后三种均用来返回结果集,且return query和return execute都会返回一个recursor类型的结果集。但需要注意在函数定义时忘记添加return语句,或者函数没有正确的返回值,可能会引发运行时错误,例子如下:

(1)在定义时缺少return语句,导致创建失败

(2)在函数体中缺少return语句,虽然可以创建成功,但是调用会失败。

(3)函数在定义时返回的数据类型,与函数体中的返回值类型不能够进行转换,会报错

(4)函数在定义时返回的数据类型,与函数体中的返回值类型能够进行转换

(5)函数在定义时返回的数据类型,与函数体中的返回值类型能够进行转换,但返回值不能与变量的数据类型进行转换,在调用时报错。

(6)函数中一旦有return语句执行成功,那return语句后面的语句将不会被执行,示例如下:

(7)return next命令可以用于标量和复合数据类型,对于复合类型,将返回一个完整的‘table’。

\set SQLTERM ;

create table t2(id int,name varchar);

insert into t2 values(1,'one');

insert into t2 values(2,'two');

\set SQLTERM /

create or replace function func2() return setof t2 as

declare

r t2%rowtype;

begin

for r in select * from t2

loop

return next r;

end loop;

return;

end;

/

\set SQLTERM ;

select func2();

(8)return query 命令,用于将一条查询结果追加到一个函数的结果集中

\set SQLTERM /

create or replace function func3() return setof t2 as

declare

r t2%rowtype;

begin

return query select * from t2;

end;

/

\set SQLTERM ;

select func3();

(9)return query execute命令是用来执行动态sql的并返回结果集。

\set SQLTERM /

create or replace function func4() return setof t2 as

begin

return query execute 'select * from t2';

end;

/

\set SQLTERM ;

select func4();

3. Function参数

在PLSQL中,function可以有无参和含参两种形式,无参函数不接受任何参数,它只是执行一些逻辑并返回一个结果,含参函数接受一个或多个参数,并根据参数执行并返回一个结果。

  1. 无参

Func1定义了一个无参函数用来获取t1表中数据的平均值,调用函数时候,使用了两种方式,一种是采用匿名块调用,一个是使用select语句进行调用。

\set SQLTERM ;

create table t1(c1 int);

insert into t1 values(1);

insert into t1 values(2);

insert into t1 values(3);

\set SQLTERM /

create or replace function func1() return int

is

avg_func1 int;

begin

select AVG(c1) into avg_func1 from t1;

return avg_func1;

end;

/

\set SQLTERM /

DECLARE

avg_func2 int;

begin

avg_func2 := func1();

raise notice '%',avg_func2;

end;

/

\set SQLTERM ;

select func1();

  1. 参数模式为in

\set SQLTERM /

CREATE OR REPLACE FUNCTION func1(p1 in int) return int AS

v1 int :=100;

v2 varchar(50) :='kingbase';

BEGIN

DBMS_OUTPUT.PUT_LINE(v1+p1);

DBMS_OUTPUT.PUT_LINE(v2);

RETURN 1;

END;

/

\set SQLTERM ;

SELECT func1(200);

  1. 参数模式为out

\set SQLTERM /

create or replace function func1 (f1 in int,f2 out int) return int as

begin

f2:=2*f1;

return f2;

end;

/

\set SQLTERM /

DECLARE

returnVar int;

f1 int;

f2 int;

BEGIN

f1 :=1;

returnVar:= func1(f1,f2);

raise notice '%', returnVar;

END

/

  1. 参数模式为inout

创建一个参数模式为in out类型的函数,在匿名块中定义了两个变量i1和i2,分别代表为func9不传入参数和传入参数,使用f1,f2两个变量来分别获取不传参和传参后的结果。

\set SQLTERM /

CREATE OR REPLACE function func9(i in out text) return text as

begin

raise notice 'i = %',i;

return i;

end;

/

\set SQLTERM /

DECLARE

i1 text;

i2 text;

f1 text;

f2 text;

BEGIN

f1:= func9(i1);

i2:='test';

f2 :=func9(i2);

END;

/

参考资料

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论