第十九课(一) 使用存储过程
来源:互联网 发布:手机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有四个参数,分别是:供应商ID(Vendors表的主键)、产品名、价格和描述。这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(既传递值给存储过程也从存储过程传回值)类型的参数。存储过程的代码括在BEGIN和END语句中,这里执行一条简单的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语句显示返回的值。
- 第十九课(一) 使用存储过程
- 第十九课(二) 使用存储过程
- SQL必知必会 笔记 第十九章 使用存储过程
- [NHibernate]存储过程的使用(一)
- 存储过程(一)
- 存储过程(一)
- 存储过程(一)
- 存储过程(一)
- 存储过程(一)
- 存储过程(Stored Procedure)使用(一)
- 关于MySQL5存储过程的使用心得(一)概述
- 存储过程(一)后台使用jdbc集成
- ORACLE中存储过程的使用(一)
- C++入门经典 笔记 (第十九章)使用链表存储信息
- 存储过程教程(一)
- 存储过程教程(一)
- 存储过程教程(一)
- 存储过程学习(一)
- 试题5:从尾到头打印链表
- 创建 Rex-Ray volume
- AndroidStudio小白入门——艰难地打开AndroidStudio,JAVA_HOME不存在以及/dev/kvm is not found
- 60. Permutation Sequence
- java并发中的ReentrantReadWriteLock
- 第十九课(一) 使用存储过程
- sql优化(1)
- LeetCode 62
- vmware下的ubuntu磁盘空间不够用,如何扩容
- 原码,反码,补码详解及 Java中>>和>>>的区别
- sql优化(2)
- equals和hashCode
- java笔试面试题
- Bootstrap学习