• GBASE 8s自定义存储过程和函数


    1、GBASE8s自定义存储过程和函数介绍
    存储过程(Stored Procedure)是一组已经事先编译好、能完成特定功能的 SQL 语句集合,是一个独
    立的数据库
    对象。存储过程类似于高级语言中的函数,可被用户的应用程序调用、执行。不同的是,存储过程经过
    编译后存放
    在服务器端,这为开发 C/S(客户端/服务器)和 B/S(浏览器/服务器)应用程序提供了强有力的支
    持。由于存储
    过程是已经编译好的代码,所以执行时不必再次进行编译,从而提高了程序的执行效率。
    SPL(Stored Procedure Language)是在 GBase 8s 中提供的一种流程控制(分支和循环)的 SQL, 是 GBase
    8s 对标准 SQL 的扩充,用于编写存储过程。GBase 8s 中的存储过程包括 SPL 过程(没有返回值)和
    SPL 函数
    (有返回值)。存储过程将在创建时被解析和优化,它以可执行的方式保存在 system catalog 表中。
    存储过程的优点
    1)、模块化
    类似于高级语言中的函数,存储过程一旦建立就可由不同用户利用 SPL 编写的程序调用,使代码的复用
    性提高,
    减少代码量。
    2)、提高性能
    存储过程在创建时就进行了编译并存储在服务器中,以后对它的任何调用都不需再进行编译。因此存储
    过程的这种
    一次编译、多次执行的特点大大提高了程序执行的速度及性能。
    3)、减少网络流量
    存储过程经过编译存储于服务器,数据的处理和操作均在服务器端进行。调用时只需将存储过程的名称
    以及参数传
    递给服务器,不用每次访问都传递很长的 SPL 语句段,从而降低了网络传输的开销。
    4)、提高安全性
    存储过程可以提高应用程序的安全性。参数化的存储过程有助于保护应用程序不受SQL 注入(SQL
    Injection)攻
    击,此外还可以设定某些用户具有对指定存储过程的使用权限,保障数据库安全。
    2、存储过程及函数的语法结构
    创建存储过程和 SPL 函数
    在 SPL 中创建存储过程的一般格式如下:
    CREATE PROCEDURE <存储过程名> (<参数列表>) [SPECIFIC <重载函数名>] {语句块} END PROCEDURE;
    其中,SPECIFIC 关键字表示可以指定 SPL 存储过程或函数一个简短的、独一无二的函数名称。这个名
    字在数据库
    中是唯一的。这一关键字也表明我们在 GBase 8s 中定义的存储过程和函数是可以重载的,即可定义多
    个具有相同
    名字的 SPL 函数,它们虽然名称相同,但是参数或类型各不相同。
    语 句 块 即 一 组 SPL 或 SQL 语 句 , 隐 式 的 语 句 块 包 含 在CREATE PROCEDURE/FUNCTION 和
    END
    PROCEDURE/FUNCITON 之间,可使用 BEGIN 和 END 来显式地指明内嵌在另一个语句块中的语句
    块。
    创建 SPL 函数的一般格式如下:
    CREATE FUNCTION <函数名> (<参数列表>) RETURNING <返回值类型>[AS <返回值名>] [SPECIFIC <重载函数名>] {语句块} END FUNCTION;
    RETURNING 或 RETURNS 关键字用来定义返回值的返回类型,返回类型可以是除Serial/Serial8 和 Text/Byte 外的
    任意一种 SQL 的数据类型,在定义返回值类型时我们可以使用 AS 为返回值取一个名字。在过程体内必
    须至少有
    一个 return 语句。
    SPL 中的流程控制
    在 SPL 中,流程控制(也称流控制)是由若干关键字实现的,包括 WHILE、IF、ELSE、BREAK、CASE
    等,流程
    控制语句使用这些关键字实现对程序执行流程的精确控制,在程序中恰当地使用流程控制结构能够使程
    序更具条理
    性、结构性。本节将重点介绍流程控制结构中的选择结构和循环结构。
    在 GBase 8s 中有两种形式的选择结构,一种是 IF…ELSE 选择结构,另一种是 CASE选择结构。
    (1)IF…ELSE 条件语句
    IF…ELSE 条件语句的语法格式为: IF < Boolean 表达式> l {SPL 语句|语句块} [ ELSE l {SPL 语句|语句块} ]
    Boolean 表达式为返回 TRUE 或者 FALSE 的表达式,且如果该表达式中含有 SELECT表达式,则需要用
    圆括号将其
    括起来。程序执行时,首先确定 Boolean 表达式的值,如果值为 TRUE,则紧接着执行 IF 关键字后的
    语句块;如
    果值为 FALSE 且 ELSE 关键字存在,则执行接 ELSE 后的语句块;如果 ELSE 关键字不存在,则跳过 IF
    选择结构,
    执行后面的程序。GBase 8s 允许 IF…ELSE 结构的嵌套,我们可以根据需要利用嵌套结构编写较复杂的
    SPL 语句
    块。
    (2)CASE 结构
    某些复杂的程序可能要对一个变量的值进行多次判断,如果使用 IF…ELSE 结构,就会使程序显得很繁琐
    (尤其是
    在嵌套出现的情况下),代码量加大。这时可以使用 CASE结构来简化代码。
    CASE 函数的语法格式如下:
    CASE(<条件表达式>) WHEN<比较值 1>THEN SPL 语句 1 WHEN<比较值 2>THEN SPL 语句 2 …[ELSE SPL 语句] END CASE;
    对于简单的 CASE 函数,程序首先计算条件表达式的值,然后按照 WHEN 关键字的顺序依次计算“条件
    表达式=比
    较值 1”的值并返回第一个计算为 TRUE 所对应的 SPL 语句。如果所有的“条件表达式=比较值”的计算结
    果都为
    FALSE,则返回 ELSE SPL 语句,如果 ELSE SPL 语句不存在,则返回 NULL。 (3)循环结构
    当在程序中需要反复执行一段相同代码时,可以利用 SPL 提供的循环结构实现这样的复杂功能。WHILE
    循环结构
    如下:
    WHILE (Boolean 表达式) l {SPL 语句|语句块} END WHILE;
    执行 WHILE 语句时,首先判断 Boolean 表达式是否成立(即该 Boolean 表达式值是否为 TRUE),如
    成立,则进
    入循环体顺序执行 SPL 语句或语句块,否则中断 WHILE 结构的执行,从结构后的第一个语句开始执
    行;如果
    Boolean 表达式值为 FALSE,则跳出,WHILE循环从后面的第一个语句开始执行。在 WHILE 循环体内
    的所有 SPL
    语句或语句执行完毕后,程序流程回到 WHILE 结构的开头重新执行。需要说明的是 WHILE 结构允许嵌
    套。
    执行 SPL 函数或存储过程
    执行已存在的存储过程应使用 EXECUTE 命令,其基本的执行语法格式如下:
    EXECUTE PROCEDURE <存储过程|SPL 函数名>(参数列表);
    GBase 8s 还可以利用 CALL 语句从一个存储过程中调用另一个存储过程:
    CALL <存储过程|SPL 函数名>(参数列表)[ RETURNING <变量名>]
    在调用时,参数可以是 SPL 语句或语句块,只要该语句返回单值,并且具有适当的类型和长度。如果所
    填写的参
    数个数少于被调用的存储过程的参数,则未说明的参数被初始化为其缺省值,该缺省值在创建存储过程
    时声明,若
    无缺省值,则返回错误。
    删除 SPL 函数或存储过程
    在 GBase 8s 中删除存储过程和 SPL 函数的语句分别为:
    删除存储过程的语法格式为:
    DROP [SPECIFIC] PROCEDURE <存储过程名>(参数列表);
    删除 SPL 函数的语法格式为:
    DROP [SPECIFIC] FUNCTION <存储过程名>(参数列表);
    GBase 8s 提供了一个语法格式同时可以用来删除 SPL 的存储过程和函数:
    DROP [SPECIFIC] ROUTINE <存储过程名>(参数列表); 3、GBASE 8s 自定义存储过程和函数示例
    一个完整的存储过程示例如下:
    CREATE PROCEDURE read_address(lastname CHAR(15)) RETURNING CHAR(15), CHAR(15), CHAR(20), CHAR(5); DEFINE p_lname, p_fname CHAR(15); DEFINE p_addr CHAR(20); DEFINE p_zip CHAR(5); SELECT fname, address1, zipcode INTO p_fname, p_addr, p_zip FROM customer WHERE lname=lastname; RETURN p_fname, lastname, paddr, p_zip; END PPROCEDURE DOCUMENT “this procedure takes the last name of a customer as its only argument, it returns the name and the address of the customer” WITH LISTING IN “/tmp/test /listfile”

  • 相关阅读:
    【吴恩达机器学习-笔记整理】异常检测与高斯分布
    Python中的字典(Dictionary)学习
    springboot压测并发设置/nginx关于限制请求数和连接数
    【Java EE初阶二十八】简单的博客系统
    【Linux 命令行参数解析函数getopt()】原理及直白理解
    P1541 [NOIP2010 提高组] 乌龟棋
    云计算导论(3)---分布式文件系统
    【数之道 08】走进“卷积神经网络“,了解图像识别背后的原理
    DllMain 入口点
    java kafka客户端何时设置的kafka消费者默认值
  • 原文地址:https://blog.csdn.net/qq_39280087/article/details/126498587