目 录
金仓数据库KingbaseES嵌套函数介绍
关键字:
KingbaseES、子程序、嵌套函数
什么是嵌套函数?
概述
一个函数或存储过程,可以定义在PL/SQL匿名块或另一个函数或存储过程的声明中,把它叫称做嵌套函数。
相关定义
- PL/SQL块(PL/SQL block):块是PL/SQL源程序中的用来将相关的声明和语句分割的基本单元。块是可以嵌套使用的,在一个块中,还可以存在多个平级的块。
- 子程序(subprogram):是一个能够通过一组参数进行调用的命名PL/SQL块。可以在PL/SQL块或另一个子程序中声明和定义子程序。函数和存储过程都是子程序。
- 嵌套函数:一个匿名块、函数或存储过程声明部分定义了另一个子程序,该子程序只能在该匿名块、函数或存储过程中使用。
- 重载(overloading):PL/SQL允许对局部子程序(local subprogram)、包中的子程序(packaged subprograms)和类型方法(type methods)进行重载。不同子程序只要形式参数的数量、顺序或者参数的数据类型族(datatype family)不同,那么是可以使用相同的名称。
嵌套函数的声明和定义
- kingbase数据库支持如下的子程序定义
- 在匿名PL/SQL块或另一个子程序中定义子程序。可以同时声明和定义它,或者先声明而后在相同的block块中进行定义。
- 模式下创建的函数、存储过程中支持子程序。可以同时声明和定义它,或者先声明而后在同级的函数或存储过程中进行定义。
- 在另一个子程序中定义子程序。
- 包声明中支持子程序声明,包体中支持子程序定义。
- kingbase数据库中函数的声明和定义
- 函数声明语法:
嵌套函数示例:函数FUNC1中定义了两个嵌套函数func11和func22
\set SQLTERM / CREATE OR REPLACE FUNCTION FUNC1() RETURN INT AS FUNCTION FUNC11() RETURN INT AS BEGIN RAISE NOTICE 'NEST_FUNCTION11'; RETURN 11; END; FUNCTION FUNC22() RETURN INT AS BEGIN RAISE NOTICE 'NEST_FUNCTION22'; RETURN 22; END; BEGIN NULL; RETURN 1; END; / \set SQLTERM ; |
Kingbase数据库中执行示例结果:
- kingbase数据库中存储过程的声明和定义
- 存储过程声明语法:
存储过程定义语法:
嵌套存储过程示例:存储过程PROC1中定义了两个嵌套存储过程proc11和proc22 \set SQLTERM / CREATE OR REPLACE PROCEDURE PROC1() AS PROCEDURE PROC11() AS BEGIN RAISE NOTICE 'NEST_PROCEDURE11'; END; PROCEDURE PROC22() AS BEGIN RAISE NOTICE 'NEST_PROCEDURE22'; END; BEGIN NULL; END; / \set SQLTERM ; CALL PROC1(); |
Kingbase数据库中执行示例结果:
嵌套函数参数
嵌套函数参数和普通函数、存储过程中的参数说明一样,可以指定参数模式、参数默认值等。嵌套函数与普通函数实参表示法相同,参数的指定允许以位置参数或指名参数两种格式。
唯一的区别是嵌套函数的参数可以是定义在PL/SQL块中的集合类型或自定义类型,而普通函数或存储过程的参数不可以。
- 嵌套函数带参数示例:
-
\set SQLTERM /
CREATE OR REPLACE FUNCTION FUNC1() RETURN INT AS
i TEXT;
FUNCTION FUNC11(a1 IN TEXT) RETURN INT AS
BEGIN
RAISE NOTICE 'a1: %',a1;
RETURN 11;
END;
BEGIN
i :=FUNC11('KINGBASE');
RETURN 1;
END;
/
\set SQLTERM ;
select func1();
- Kingbase数据库中执行示例结果:
嵌套函数重载
如果嵌套函数的形参名字、个数、数据类型不同,嵌套函数可以重载。如果形参只是名字不同,必须使用参数名称指定对应的实参。
嵌套函数不可以重载,有下面几种情况:
a. 参数只有mode不同。
b. 只有返回值类型不同。
- 嵌套函数重载示例:
-
\set SQLTERM /
CREATE OR REPLACE FUNCTION FUNC1() RETURN INT AS
i TEXT;
j int;
FUNCTION FUNC11(a1 IN TEXT) RETURN INT AS
BEGIN
RAISE NOTICE 'a1: %',a1;
RETURN 11;
END;
FUNCTION FUNC11(a1 IN INT) RETURN INT AS
BEGIN
RAISE NOTICE 'a1: %',a1;
RETURN 11;
END;
BEGIN
i :=FUNC11('KINGBASE');
j :=FUNC11(1234567);
RETURN 1;
END;
/
\set SQLTERM ;
select func1();
- Kingbase数据库中执行示例结果:
嵌套函数调用
嵌套函数只能在声明它的PL/SQL块、函数、存储过程中调用。调用嵌套函数时,在当前PL/SQL块声明中搜索匹配的函数,如果找不到匹配的嵌套函数,报错。
目前kingbase中子程序调用只考虑支持:
1、子函数()
2、父函数.子函数()
3、父函数.子函数.子函数…
- 嵌套函数调用示例:
\set SQLTERM / DECLARE v1 integer; v2 integer := 100; PROCEDURE test(id integer) AS v2 integer := 10; v3 integer; PROCEDURE test(id integer) AS v3 integer; BEGIN v3 := 10; raise notice 'in the second test function'; END; BEGIN call test(2); v3 := v2; raise notice 'in the first test function'; END; BEGIN call test(1); END; / \set SQLTERM ; |
- Kingbase数据库中执行示例结果:
嵌套函数变量
把包含嵌套函数的函数、存储过程、匿名块称为父程序。父程序不可以引用嵌套函数的变量。但是嵌套函数可以引用父程序中的变量。
- 嵌套函数变量使用示例:
\set SQLTERM / CREATE OR REPLACE FUNCTION FUNC1() RETURN INT AS i TEXT; j TEXT; FUNCTION FUNC11(a1 IN TEXT) RETURN INT AS BEGIN j :='BEIJING'; RAISE NOTICE 'a1: %',a1; RAISE NOTICE 'j: %',j; RETURN 11; END; BEGIN i :=FUNC11('KINGBASE'); RETURN 1; END; / \set SQLTERM ; select func1(); |
- Kingbase数据库中执行示例结果: