存储过程(Stored Procedure)是一组已经事先编译好,能够完成特定功能的SQL语句集合,是一个独立的数据库对象。存储过程类似于高级语言中的函数,可被用户的应用程序调用,执行。不同的是,存储过程经过编译后存放在服务器端,这为开发C/S和B/S应用程序提供了强有力的支持。由于存储过程是已经编译好的代码,所以执行时不必再次进行编译,从而提高了程序的执行效率。
存储过程的优点 模块化 类似于高级语言中的函数,存储过程一旦简历就可由不同用户利用SPL编写的程序调用,使代码的复用性提高,减少代码量。
提高性能 存储过程在创建时就进行了编译,并存储在服务器中。以后对它的任何调用都不需在进行编译。因此存储过程的这种一次编译,多次执行的特点大大提高了程序执行的速度及性能。
减少网络流量 存储过程经过编译存储于服务器,数据的处理和操作均在服务器端进行。调用时只需将存储过程的名称及参数传递给服务器,不用每次访问都传递很长的SQL语句段,从而降低了网络传输的开销。
提高安全性 存储过程可以提高应用程序的安全性。参数化的存储过程有助于保护应用程序不受SQL注入攻击,此外还可以设定某些用户具有对指定过程的使用权限,保障数据库安全。
存储过程及函数的语法结构 创建存储过程的SPL函数 在SPL中创建存储过程的一般格式如下:
CREATE [OR REPLACE] PROCEDURE/FUNCTION <存储过程名> ( <参数列表> )
{ 语句块 }
END;
语句块既一组SPL或SQL语句,隐式的局域块包括在CREATE PROCEDURE、FUNCTION和 END 之间, 可使用BEGIN 和END 来显示的指明内嵌在一个语句块中的语句块。
RETURING 或 RETURNS 关键字用来定义返回值的返回类型,返回类型可以是除Serial/Serial8和Text/Byte外的任意一种SQL的数据类型,在定义返回值类型时我们可以使用AS为返回值去一个名字。在函数体内必须有一个RETURN语句。
存储过程及函数的流程控制 IF、ELSE条件语句 IF、ELSE条件语句的语法格式为:
IF <表达式> THEN
{ 语句块 }
ELSEIF <表达式> THEN
{ 语句块 }
ELSE
{ 语句块 }
END IF;
CASE结构 某些复杂的程序可能要对一个变量的值进行多次判断,如果使用IF、ELSE结构就会使得程序,显得很繁琐,代码量加大。这时可以使用CASE结构来简化代码。
CASE函数的语法格式如下:
CASE <表达式>
WHEN <比较值> THEN
{ 语句块 }
WHEN <比较值> THEN
{ 语句块 }
…
END CASE;
循环结构 当在程序中需要反复执行一段相同代码时,可以利用SPL提供的循环结构实现这样的复杂功能。WHILE循环结构如下:
WHILE <表达式>
{ 语句块 }
END WHILE;
执行SPL函数或存储过程 执行已存在的存储过程应使用EXECUTE命令,其基本的执行语法格式如下:
EXECUTE PROCEDURE/FUNCTION <存储过程名> (参数列表)
GBase 8s换可以利用CALL语句从一个存储过程中调用另一个存储过程:
CALL <存储过程名> (参数列表)
在调用时,参数可以是SPL语句或语句块,只要该返回单值,并且具有适当的类型和长度。如果填写的参数少于被调用的存储过程的参数,则未说明的参数被初始化为默认值,该默认值在创建存储过程时生命,若无默认值,返回错误。
删除函数或存储过程 在Gbase 8s中删除存储过程和SPL函数的语句如下。
DROP PROCEDURE/FUNCTION <存储过程名> (参数列表)