人大金仓 金仓数据库KingbaseES嵌套函数介绍

目 录

文档记录 II

目 录 III

金仓数据库KingbaseES嵌套函数介绍 1

关键字: 1

1. 什么是嵌套函数? 1

2. 嵌套函数的声明和定义 1

3. 嵌套函数参数 4

4. 嵌套函数重载 5

5. 嵌套函数调用 6

6. 嵌套函数变量 8

参考资料 9

金仓数据库KingbaseES嵌套函数介绍

关键字:

KingbaseES、子程序、嵌套函数

什么是嵌套函数?

概述

一个函数或存储过程,可以定义在PL/SQL匿名块或另一个函数或存储过程的声明中,把它叫称做嵌套函数。

相关定义

  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)不同,那么是可以使用相同的名称。

嵌套函数的声明和定义

  • kingbase数据库支持如下的子程序定义
  1. 在匿名PL/SQL块或另一个子程序中定义子程序。可以同时声明和定义它,或者先声明而后在相同的block块中进行定义。
  2. 模式下创建的函数、存储过程中支持子程序。可以同时声明和定义它,或者先声明而后在同级的函数或存储过程中进行定义。
  3. 在另一个子程序中定义子程序。
  4. 包声明中支持子程序声明,包体中支持子程序定义。
  • kingbase数据库中函数的声明和定义
  • 函数声明语法:

函数定义语法:

人大金仓 金仓数据库KingbaseES嵌套函数介绍_第1张图片

嵌套函数示例:函数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数据库中执行示例结果:

人大金仓 金仓数据库KingbaseES嵌套函数介绍_第2张图片

  • 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数据库中执行示例结果:

人大金仓 金仓数据库KingbaseES嵌套函数介绍_第3张图片

嵌套函数参数

嵌套函数参数和普通函数、存储过程中的参数说明一样,可以指定参数模式、参数默认值等。嵌套函数与普通函数实参表示法相同,参数的指定允许以位置参数或指名参数两种格式。

唯一的区别是嵌套函数的参数可以是定义在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数据库中执行示例结果:

人大金仓 金仓数据库KingbaseES嵌套函数介绍_第4张图片

嵌套函数重载

如果嵌套函数的形参名字、个数、数据类型不同,嵌套函数可以重载。如果形参只是名字不同,必须使用参数名称指定对应的实参。

嵌套函数不可以重载,有下面几种情况:

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数据库中执行示例结果:

人大金仓 金仓数据库KingbaseES嵌套函数介绍_第5张图片

嵌套函数调用

嵌套函数只能在声明它的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数据库中执行示例结果:

人大金仓 金仓数据库KingbaseES嵌套函数介绍_第6张图片

嵌套函数变量

把包含嵌套函数的函数、存储过程、匿名块称为父程序。父程序不可以引用嵌套函数的变量。但是嵌套函数可以引用父程序中的变量。

  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 ;

select func1();

  • Kingbase数据库中执行示例结果:

人大金仓 金仓数据库KingbaseES嵌套函数介绍_第7张图片

你可能感兴趣的:(oracle,数据库)