本文正在参与炫“库”行动-人大金仓征文大赛,活动链接:CSDNhttps://marketing.csdn.net/p/98bd30353e7cb998b6070a89e8b91edb
一、什么是嵌套函数 1、概述一个函数或存储过程,可以定义在PL/SQL匿名块或另一个函数或存储过程的声明中,把它叫称做嵌套函数。
2、相关定义
(1)PL/SQL块(PL/SQL block):块是PL/SQL源程序中的用来将相关的声明和语句分割的基本单元。块是可以嵌套使用的,在一个块中,还可以存在多个平级的块。
(2)子程序(subprogram):是一个能够通过一组参数进行调用的命名PL/SQL块。可以在PL/SQL块或另一个子程序中声明和定义子程序。函数和存储过程都是子程序。
(3)嵌套函数:一个匿名块、函数或存储过程声明部分定义了另一个子程序,该子程序只能在该匿名块、函数或存储过程中使用。
(4)重载(overloading):PL/SQL允许对局部子程序(local subprogram)、包中的子程序(packaged subprograms)和类型方法(type methods)进行重载。不同子程序只要形式参数的数量、顺序或者参数的数据类型族(datatype family)不同,那么是可以使用相同的名称。
二、嵌套函数的声明和定义
1、kingbase数据库支持如下的子程序定义
(1)在匿名PL/SQL块或另一个子程序中定义子程序。可以同时声明和定义它,或者先声明而后在相同的block块中进行定义。
(2)模式下创建的函数、存储过程中支持子程序。可以同时声明和定义它,或者先声明而后在同级的函数或存储过程中进行定义。
(3)在另一个子程序中定义子程序。
(4)包声明中支持子程序声明,包体中支持子程序定义。
2、kingbase数据库中函数的声明和定义
(1)函数声明语法:
(2)函数定义语法:
(3)嵌套函数示例:函数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 ;
(4)Kingbase数据库中执行示例结果:
3、 kingbase数据库中存储过程的声明和定义(1)存储过程声明语法:
(2)存储过程定义语法:
(3)嵌套存储过程示例:存储过程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 ;
(4)Kingbase数据库中执行示例结果:
三、 嵌套函数参数嵌套函数参数和普通函数、存储过程中的参数说明一样,可以指定参数模式、参数默认值等。嵌套函数与普通函数实参表示法相同,参数的指定允许以位置参数或指名参数两种格式。
唯一的区别是嵌套函数的参数可以是定义在PL/SQL块中的集合类型或自定义类型,而普通函数或存储过程的参数不可以。
1、嵌套函数带参数示例:
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 ;
2、Kingbase数据库中执行示例结果:
四、嵌套函数重载
如果嵌套函数的形参名字、个数、数据类型不同,嵌套函数可以重载。如果形参只是名字不同,必须使用参数名称指定对应的实参。
嵌套函数不可以重载,有下面几种情况:
a. 参数只有mode不同。
b. 只有返回值类型不同。
1、嵌套函数重载示例:
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 ;
2、Kingbase数据库中执行示例结果:
五、嵌套函数调用
嵌套函数只能在声明它的PL/SQL块、函数、存储过程中调用。调用嵌套函数时,在当前PL/SQL块声明中搜索匹配的函数,如果找不到匹配的嵌套函数,报错。
目前kingbase中子程序调用只考虑支持:
1、子函数()
2、父函数.子函数()
3、父函数.子函数.子函数…
1、嵌套函数调用示例: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 ;
2、Kingbase数据库中执行示例结果:
六、嵌套函数变量把包含嵌套函数的函数、存储过程、匿名块称为父程序。父程序不可以引用嵌套函数的变量。但是嵌套函数可以引用父程序中的变量。
1、嵌套函数变量使用示例: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 ;
2、Kingbase数据库中执行示例结果:
本文正在参与炫“库”行动-人大金仓征文大赛,活动链接:
CSDNhttps://marketing.csdn.net/p/98bd30353e7cb998b6070a89e8b91edb



