第十九课(一) 使用存储过程

来源:互联网 发布:手机pdf编辑软件 编辑:程序博客网 时间:2024/06/07 11:06

第十九课   使用存储过程

        预习与回顾:

        第十八课学习了视图,视图为虚拟的表。它们包含的不是数据而是根据需要检索数据的查询。视图提供了一种封装SELECT语句的层次,可用来简化数据处理,重新格式化或保护基础数据;第十九课将学习什么是存储过程,为什么要使用存储过程,如何使用存储过程,以及创建和使用存储过程的基本语法。

        19.1、存储过程

        存储过程就是为以后使用而保存的一条或多条SQL语句。可将其视为批文件,虽然它们的作用不仅限于批处理

        19.2、为什么使用存储过程

        1、通过把处理封装在一个易用的单元中,可以简化复杂的操作;

2、由于不要求反复建立一系列处理步骤,因而保证了数据的一致性。

3、简化对变动的管理。---这一点的延伸就是安全性。通过存储过程限制对基础数据的访问,减少了数据讹误(无意识的或别的原因所导致的数据讹误)的机会。
        4、因为存储过程通常以编译过的形式存储,所以DBMS处理命令的工作较少,提高了性能。
        5、存在一些只能用在单个请求中的SQL元素和特性,存储过程可以使用它们来编写功能更强更灵活的代码。

存储过程有三个主要的好处,即简单、安全、高性能

6、不同DBMS中的存储过程语法有所不同。

7、许多数据库管理员把限制存储过程的创建作为安全措施(主要受上一条缺陷的影响)。

        19.3、执行存储过程

        EXECUTE语句来实现。

        EXECUTE接受存储过程、名和需要传递给它的任何参数

eg:
输入▼
EXECUTE AddNewProduct( 'JTS01',
                                               'Stuffed Eiffel Tower',
                                                6.49,
                                               'Plush stuffed toy with the text La
➥Tour Eiffel in red white and blue' ); 这里执行一个名为AddNewProduct的存储过程,将一个新产品添加到Products表中。AddNewProduct有四个参数,分别是:供应商IDVendors表的主键)、产品名、价格和描述。这4个参数匹配存储过程中4个预期变量(定义为存储过程自身的组成部分)。此存储过程将新行添加到Products表,并将传入的属性赋给相应的列。

        存储过程所完成的工作:
1、验证传递的数据,保证所有4个参数都有值;
2、生成用作主键的唯一ID;
3、将新产品插入Products表,在合适的列中存储生成的主键和传递的数据。

       19.4创建存储过程

       输入▼
CREATE PROCEDURE MailingListCount (ListCount OUT INTEGER)

            ISv_rows INTEGER;
BEGIN

           SELECT COUNT(*) INTOv_rows
FROM Customers
             WHERE NOT cust_email ISNULL;
                             ListCount :=v_rows;

END;

        分析▼这个存储过程有一个名为ListCount的参数。此参数从存储过程返回一个值而不是传递一个值给存储过程。关键字OUT用来指示这种行为。Oracle支持IN(传递值给存储过程)、OUT(从存储过程返回值,如这里)、INOUT(既传递值给存储过程也从存储过程传回值)类型的参数。存储过程的代码括在BEGINEND语句中,这里执行一条简单的SELECT语句,它检索具有邮件地址的顾客。然后用检索出的行数设置ListCount(要传递的输出参数)。

输入▼
var ReturnValue NUMBER
          EXECMailingListCount(:ReturnValue);
                     SELECT ReturnValue;
       分析▼这段代码声明了一个变量来保存存储过程返回的任何值,然后执行存储过程,再使用SELECT语句显示返回的值。

       SQL Server版本:
输入▼
CREATE PROCEDURE MailingListCount
                AS DECLARE @cnt INTEGER
SELECT @cnt = COUNT(*)
                FROM Customers
                             WHERE NOTcust_email IS NULL;
RETURN @cnt;
分析▼此存储过程没有参数。调用程序检索SQL Server的返回代码支持的值。其中用DECLARE语句声明了一个名为@cnt的局部变量(SQL Server中所有局部变量名都以@起头);然后在SELECT语句中使用这个变量,让它包含COUNT()函数返回的值;最后,用RETURN@cnt语句将计数返回给调用程序。

       调用SQL Server例子可以像下面这样:
输入▼
DECLARE @ReturnValue INT
EXECUTE @ReturnValue=MailingListCount;
SELECT @ReturnValue;
分析▼这段代码声明了一个变量来保存存储过程返回的任何值,然后执行存储过程,再使用SELECT语句显示返回的值。