关键字:
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可以有无参和含参两种形式,无参函数不接受任何参数,它只是执行一些逻辑并返回一个结果,含参函数接受一个或多个参数,并根据参数执行并返回一个结果。
- 无参
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();
- 参数模式为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);
- 参数模式为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
/
- 参数模式为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;
/




