第7章 存储过程和触发器
第7章 存储过程和触发器
ALTER PROCEDURE student_info1
( @number char(6), @cname char(16) ) AS SELECT 学号, 课程名, 成绩 FROM CJB, KCB
WHERE CJB.学号=@number and KCB.课程名=@cname
GO
数据库应用技术
4、使用T-SQL命令删除存储过程
从数据库中删除存储过程时,使用DROP PROCEDURE 语句可永久地删除存储过程。 语法格式: DROP PROCEDURE 过程名
【例7.9】 删除student_info1存储过程。
数据库应用技术 二、存储过程的优点
(1)执行速度快。
存储过程在服务器端运行,执行速度快。 (2)提高工作效率和系统性能。 存储过程在创建后,可以被多次调用。可以将经常执行 的操作创建成存储过程,在以后的操作中多次调用, 而不必重新书写语句。 存储过程经过编译后,其执行规划就驻留在高速缓冲存 储器,在以后的操作中只需从高速缓冲存储器中调用 已编译好的二进制代码执行,无需每次编译,提高了 系统的性能。
数据库应用技术
三、存储过程的类型
(1) 系统存储过程
是由系统提供的存储过程。它定义在系统数据库 master中,其前缀是sp_,例如sp_addtype。系统存储 过程可在任何数据库中使用。 (2) 扩展存储过程 通常以动态链接库(.dll)形式存在,使用时,加载到 SQL Server中。其前缀是xp_。 (3) 用户存储过程
数据库应用技术
(3) 使用带输出参数( OUPUT)的存储过程。
【例7.3】 创建存储过程do_insert,作用是向XSB表中插入 一行数据。 创建存储过程do_insert: CREATE PROCEDURE do_insert
数据库设计中的存储过程与触发器
数据库设计中的存储过程与触发器数据库设计在软件开发中起着至关重要的作用,它决定着数据的结构、存储和访问方式。
在数据库设计中,存储过程和触发器是两个常用的技术,它们能够帮助我们更好地实现数据管理和处理的目标。
本文将重点探讨数据库设计中的存储过程与触发器,并介绍它们的作用、使用场景和优缺点。
一、存储过程存储过程是一组预编译的SQL语句集合,可以在数据库服务器上进行执行。
它们通常用于实现复杂的数据库操作、数据验证和业务逻辑。
存储过程可以被视为一种封装了的数据库操作,通过调用存储过程,我们可以实现统一的数据处理逻辑,提高代码的复用性和可维护性。
在数据库设计中,存储过程可以起到以下几个作用:1. 数据的一致性和完整性控制:存储过程可以通过在执行之前进行数据验证、规范化和自动修复,保证数据的一致性和完整性。
2. 事务管理:存储过程可以帮助我们实现复杂的事务处理,通过定义事务的边界、控制事务的提交和回滚,确保数据的一致性和可靠性。
3. 数据库性能优化:存储过程可以通过预编译和优化查询语句等技术手段,提高数据库的访问效率和响应速度。
存储过程的使用场景多样,例如在用户注册时进行用户名的唯一性验证,在订单提交时计算订单总价等。
然而,存储过程并非适合所有情况,它也存在一些缺点,如可移植性差、调试困难等。
因此,在使用存储过程时应权衡其利弊,并根据具体需求做出选择。
二、触发器触发器是与数据库表相关联的一种特殊对象,它在表上的插入、更新或删除操作时被自动触发执行。
触发器可以用于实现诸多数据库功能,如数据验证、派生数据和审计跟踪等。
触发器的主要作用如下:1. 数据验证和约束:触发器可以在插入、更新或删除数据之前进行数据验证和约束,确保数据的完整性和一致性。
2. 派生数据:通过触发器,可以自动计算和派生某些数据,避免手动计算和维护数据的复杂性。
3. 审计跟踪:触发器可以在数据操作时记录相关的变更信息,以实现审计和追踪功能,用于安全和合规需求。
数据库中的存储过程与触发器
数据库中的存储过程与触发器数据库是一个用于存储和管理大量数据的集合,而存储过程和触发器作为数据库中的两种重要对象,在实际的数据库应用中发挥着重要的作用。
本文将详细介绍数据库中的存储过程和触发器的定义、作用以及使用方式,并对它们在实际应用中的优势进行探讨。
存储过程是一组预编译的SQL语句集合,这些语句经过编译并且存储在数据库中,以便后续的重用。
存储过程可以接受参数,并且通过执行一系列SQL语句来实现复杂的操作。
存储过程的主要作用包括提高数据库的性能、减少网络流量、实现封装和重用性。
首先,存储过程可以提高数据库的性能。
当执行一组SQL语句时,存储过程会将这些语句一次性发送给数据库服务器,并且在服务器上进行预编译和优化。
相比于每次发送单独的SQL语句,存储过程能够减少网络往返的时间,提高执行效率。
其次,存储过程能够减少网络流量。
由于存储过程的执行过程在数据库服务器上完成,它只需要将执行结果返回给客户端,而不需要将整个SQL语句和数据传输回客户端。
这样不仅减少了网络传输的数据量,还减少了网络请求的次数,有效降低了网络流量。
此外,存储过程实现了封装和重用性的特点。
通过将一系列SQL语句封装在一个存储过程中,可以减少代码的重复性,提高代码的可维护性。
同时,存储过程可以在不同的应用程序中被调用,实现了代码的重用性,提高了开发效率。
在实际应用中,存储过程常用于完成复杂的业务逻辑。
例如,在某电商网站的订单系统中,存储过程可以用于完成下单流程的各个环节,包括生成订单、更新库存、计算订单总价等。
通过使用存储过程,可以确保这些操作的原子性,避免了在应用层面上进行多个SQL语句的事务管理。
另一个重要的数据库对象是触发器。
触发器是数据库中的一类特殊对象,它与表相关联,并且在特定的事件发生时自动执行一些操作。
触发器的主要作用包括数据完整性的维护、业务规则的实施以及数据审计等。
首先,触发器能够维护数据的完整性。
通过在数据操作之前或之后触发相应的操作,触发器可以保证数据库中的数据满足特定的约束条件。
实验7 创建和管理存储过程和触发器
实验7 创建和管理存储过程和触发器实验目的●了解存储过程的类型和作用,并掌握使用Transact-SQL语言创建存储过程的方法●理解触发器的特点和作用,并掌握使用Transact-SQL语言创建触发器的方法背景知识存储过程是一组为了完成特定功能的SQL语句和流程控制语句的集合,经编译后存储在数据库服务器中。
它在服务器端对数据库记录进行处理,再把结果返回到客户端。
使用存储过程,可以充分利用服务器端的速度和计算能力,同时也避免把大量的数据从服务器端下载到客户端,从而减少了网络的数据流量,服务器端只需要返回计算结果给客户端即可。
因此,对于客户端来说,可以不必关心后台数据结构的变化。
存储过程可分为两类:即系统存储过程和用户自定义存储过程。
系统存储过程主要存储在master 数据库中并以sp_为前缀,它主要是从系统表中获取信息,尽管这些系统存储过程被放在master数据库中,但是仍可以在其它数据库中对其进行调用,在调用时不必在存储过程名前加上数据库名。
而且当创建一个新数据库时,一些系统存储过程会在新数据库中被自动创建。
触发器是一种特殊类型的存储过程,但它不等同于存储过程,主要区别在于触发器主要是通过事件进行触发而被执行的,当事件发生时触发器由SQL Server自动执行,而存储过程则是通过指定存储过程的名字并给出参数(如果该存储过程带有参数)而被直接调用的。
每个触发器有两个特殊的表:插入表(inserted)和删除表(deleted)。
这两个表是逻辑表,并且这两个表是由系统管理的,存储在内存中,不是存储在数据库中,因此不允许用户直接对其修改。
这两个表的结构总是与被该触发器作用的表有相同的表结构。
这两个表是动态驻留在内存中的,当触发器工作完成,这两个表也被删除。
这两个表主要保存因用户操作而被影响到的原数据值或新数据值。
另外这两个表是只读的,即用户不能向这两个表写入内容,但可以引用表中的数据,例如可以使用“select * from deleted”语句来查看deleted表中的信息。
存储过程与触发器
存储过程与触发器存储过程和触发器是关系型数据库中非常重要的概念和工具。
存储过程是一组预编译的SQL语句集合,经编译后存储在数据库中,可以被反复调用执行。
而触发器是数据库中一种特殊的对象,它与表相关联,当特定的事务操作(如INSERT、UPDATE、DELETE)在关联的表上执行时,触发器会自动执行相应的操作。
在本文中,将详细介绍存储过程和触发器的应用场景和使用方法。
存储过程的优势主要体现在以下几个方面:1.提高性能:存储过程可以减少网络传输的开销,将数据库操作逻辑集中在数据库服务器上执行,减少了网络延迟时间。
此外,存储过程可以预先编译和优化,提高了执行效率。
2.简化开发:存储过程可以将常用的业务逻辑封装在一起,减少了代码的重复编写。
开发人员只需调用存储过程,而不必重复编写相同的SQL语句。
3.减少安全风险:存储过程可以对数据库操作进行权限控制,通过给用户分配不同的执行权限,提高了数据库的安全性。
4.数据库事务管理:存储过程可以将一系列数据库操作封装在一个事务中,保证了数据的一致性和完整性。
触发器的主要优势在于:1.强制数据完整性:触发器可以通过在特定操作之前或之后执行代码,强制执行特定的条件和限制,确保数据库中的数据始终保持一致性和完整性。
2.隐藏复杂逻辑:触发器可以将复杂的业务逻辑隐藏在数据库中,使应用程序的逻辑更加简洁和清晰。
3.自动化处理:触发器可以自动执行一些操作,如更新相关表的数据,发送电子邮件等,减少了人工操作的需要,提高了工作效率。
下面以一个具体的例子来说明存储过程和触发器的使用。
假设有一个订单管理系统,包括订单表和订单明细表。
当插入一个订单时,触发器会自动计算订单的总金额,并更新到订单表中的"total_amount"字段中。
首先创建一个计算订单总金额的存储过程:CREATE PROCEDURE calculateTotalAmountASBEGINFROM order_detailsUPDATE ordersEND然后创建一个触发器,当插入新的订单明细时,自动调用存储过程计算订单的总金额:CREATE TRIGGER updateTotalAmountON order_detailsAFTERINSERTASBEGINFROM inserted;END通过以上的存储过程和触发器,当插入新的订单明细时,触发器会自动调用存储过程计算订单的总金额,并更新到订单表中。
数据库存储过程与触发器
数据库存储过程与触发器1. 引言数据库存储过程和触发器是数据库中常用的两种功能,它们可以通过在特定情况下自动执行一系列的操作,极大地提高了数据库系统的灵活性和功能性。
本文将介绍数据库存储过程和触发器的概念、作用和用法,并且以示例的方式详细展示它们在实际应用中的应用场景。
2. 数据库存储过程2.1 概念数据库存储过程是一组预定义的操作序列,它们以原子的方式执行,可以被多个应用程序调用。
存储过程通常用于处理复杂的业务逻辑、数据处理和数据验证等任务。
存储过程可以在数据库系统中被创建、编辑和执行,可以接受参数来灵活地适应不同的需求。
2.2 作用数据库存储过程具有以下几个重要的作用:•提高性能:存储过程在数据库服务器上执行,可以减少网络传输开销,提高数据库的响应速度。
•简化开发:存储过程将一些常用的操作封装起来,开发者可以通过简单的调用存储过程来完成复杂的业务逻辑,减少了开发工作量。
•保证数据的一致性:存储过程可以通过事务控制来确保数据的一致性和完整性。
2.3 用法数据库存储过程的用法如下:1.创建存储过程:使用CREATE PROCEDURE语句来创建存储过程,并定义输入参数、输出参数和过程体。
CREATE PROCEDURE procedure_name [ (parameter1, parameter2, ...)][RETURNS return_type]BEGIN-- 过程体END;2.执行存储过程:使用CALL语句来执行存储过程,并传递参数。
CALL procedure_name (parameter1, parameter2, ...);3.删除存储过程:使用DROP PROCEDURE语句来删除存储过程。
DROP PROCEDURE procedure_name;4.查看存储过程的定义:使用SHOW PROCEDURE STATUS语句来查看数据库中的存储过程。
SHOW PROCEDURE STATUS;3. 数据库触发器3.1 概念数据库触发器是与表相关联的特殊类型的存储过程,它们在表上的特定操作(插入、更新、删除)发生时自动执行。
存储过程与触发器.ppt
13
参数说明
默认值:参数的默认值。如果定义了默认值, 默认值:参数的默认值。如果定义了默认值, 不必指定该参数的值即可执行存储过程。 不必指定该参数的值即可执行存储过程。默认 值必须是常量或NULL。如果要在存储过程中 值必须是常量或 。 对该参数使用LIKE关键字,那么默认值中可 关键字, 对该参数使用 关键字 以包含通配符( 、 、 和 )。 以包含通配符(%、_、[]和[^])。 OUTPUT:表明参数是返回参数。该选项的值 :表明参数是返回参数。 可以返回给EXEC[UTE]。使用 可以返回给 。使用OUTPUT参数 参数 可将信息返回给调用过程。 可将信息返回给调用过程。text、ntext和image 、 和 参数可用作OUTPUT参数。使用 参数。 参数可用作 参数 使用OUTPUT关键 关键 字的输出参数可以是游标占位符。 字的输出参数可以是游标占位符。
15
存储过程定义
1.无参数存储过程 无参数存储过程
2.有参数存储过程(输入参数、输出参数output) 有参数存储过程(输入参数、输出参数 有参数存储过程 )
16
例题1 建立一个查询存储过程, 例题1:建立一个查询存储过程,实现 查询成绩表中的所有及格成绩。( 。(无参 查询成绩表中的所有及格成绩。(无参 数存储过程) 数存储过程)
create proc seleproc as select * from 成绩表 where 成绩 成绩>=60 执行存储过程: 执行存储过程: exec seleproc 结果如图: 结果如图:
17
例2:创建一个向成绩表添加记录的存储 过程。(有参数存储过程) 。(有参数存储过程 过程。(有参数存储过程)
create proc insertproc @sno char(10),@cno char(3),@grade float as insert into 成绩表 values(@sno,@cno,@grade) 执行存储过程: 执行存储过程: exec insertproc '0009','03',98
第7章 存储过程 和触发器
AFTER,指定触发 器在触发SQL语句 中指定的所有操作都 已成功执行后才激发。
触发器中使用的特殊表
• inserted逻辑表:当向表中插入数据时, INSERT触发器触发执行,新的记录插 入到触发器表和inserted表中。 • deleted逻辑表:用于保存已从表中删除 的记录,当触发一个DELETE触发器时, 被删除的记录存放到deleted逻辑表中。
删除存储过程
• DROP PROCEDURE student_info1
触发器
• 触发器(Trigger)是一种特殊类型的存 储过程,它定义在一个表上,实现指定 功能的SQL语句序列。 • 当使用UPDATE、INSERT或DELETE 的一种或多种语句,对数据进行修改时, 触发器就会生效。
触发器的优点
触发器与存储过程的主要区别
• 存储过程的定义可有参数,而触发器的 定义不能有参数;
• 执行方式不同,触发器由引起表数据变 化的操作(增、删、改)触发而自动执 行,而存储过程必须通过具体的语句调 用示: CREATE TRIGGER trigger_name ON { table | view } [ WITH ENCRYPTION ] { { { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] } AS sql_statement [ ...n ] INSTEAD OF,指定执行 } 触发器而不是执行触发SQL }
• 在如下的批处理中,声明一局部游标变量,执行上述 存储过程过程并将游标赋值给局部游标变量,然后通 过该游标变量读取记录。
DECLARE @MyCursor CURSOR EXEC st_cursor @st_cursor = @MyCursor OUTPUT WHILE (@@FETCH_STATUS = 0) BEGIN FETCH NEXT FROM @MyCursor END CLOSE @MyCursor DEALLOCATE @MyCursor
存储过程和触发器课件
触发器的主要作用是用于在数据表上 自动执行一系列操作,以确保数据的 完整性和一致性。
触发器的分类与触发事件
分类
根据触发时机,触发器可分为INSERT触 发器、UPDATE触发器和DELETE触发器 。
VS
触发事件
在执行INSERT、UPDATE或DELETE操作 时,触发器会自动执行。
触发器的优缺点
作用
存储过程可以用于封装数据库操作,简化复杂的数据库操作 ,提高数据访问的效率,减少网络流量,提高数据安全性等 。
存储过程的分类
系统存储过程
系统存储过程以sp_作为前缀,主 要用于管理系统数据库的存储过 程。
自定义存储过程
用户自定义存储过程是由用户根 据自己的需求编写的存储过程。
存储过程的优缺点
触发器参数
用于传递给触发器的值或变量。
触发器返回值
触发器执行完毕后返回的值或结果。
触发器的使用示例
• 示例1:创建一个在插入操作时触发的触发器,将新插入的 记录的ID复制到另一个表中。
触发器的使用示例
AFTER INSERT ON table1
CREATE TRIGGER after_insert_example
可维护性差:随着业务逻辑的 变更,可能需要修改多个触发
器,维护成本较高。
05
触发器的创建与使用
创建触发器的基本语法
• CREATE TRIGGER 触发器名称
创建触发器的基本语法
ON 表名 FOR EACH ROW WHEN 条件
创建触发器的基本语法
BEGIN 触发器逻辑 END;
触发器的参数与返回值
存储过程和触发器课件
• 存储过程概述 • 存储过程的创建与使用 • 存储过程的调试与优化 • 触发器概述 • 触发器的创建与使用 • 触发器的调试与优化
七存储过程和触发器
实验七存储过程和触发器
一、实验目的
✓掌握通过企业管理器和Transact—sql语句SCREATE PROCEDURE创建存储过程的方法和步骤。
✓掌握通过企业管理器和Transact—sql语句Execute执行存储过程的方法。
✓掌握通过企业管理器和Transact—sql语句SCREATE PROCEDURE创建触发器的方法和步骤。
✓掌握引发触发器的方法。
✓学会使用系统存储过程。
二、实验内容与要求
1、为sell_order表创建两个存储过程:prStoreOrderID可以插入一个订单并返回订单号,prStoreOrderItem可以插入订单项。
2、创建一个存储过程,该存储过程创建一个只有一个整型字段的临时表。
然后存储过程把从1~100的数插入表中,最后作为一个结果集返回给调用者。
3、创建一个名为prUpdateName的存储过程,并用它来更新表goods中指定记录的goods_name字段。
4、使用查询分析器获取存储过程prTest的源代码。
5、使用查询分析器将存储过程prTest重命名为npr_Test。
6、使用查询分析器删除存储过程sp_Test。
7、为DEPARTMENT表创建一个触发器,使得该表中的部门号发生变化时,EMPLOYEE表中相应记录的字段自动该表,并编写命令触发之。
三、实验要求
实验报告格式要求
1.实验目的
2.实验内容
3.实验过程
4.总结。
第7章 存储过程和触发器
7.1.1 存储过程的类型
存储过程的类型:
系统存储过程: 已在系统数据库master中定义,可作为命令执行。 本地存储过程: 由用户在用户数据库中定义。 临时存储过程:
本地存储过程的一种,分为局部临时存储过程和全局临时 存储过程。
远程存储过程: 指从远程服务器上调用的存储过程。 扩展存储过程: 指在 SQL Server 环境之外的动态链接库,SQL Server 按照存储过程的方法执行。
(5) 如果一个表的外键在 DELETE、UPDATE 操作上定义了级联,则不能在该表 上定义 INSTEAD OF DELETE、INSTEAD OF UPDATE 触发器。
(7) 在触发器内可以指定任意的 SET 语句,所选择的 SET 选项在触发器执行期 间有效,并在触发器执行完后恢复到以前的设置。 (8) 触发器中不允许包含以下 T-SQL 语句:
调用存储过程的语法格式:
[ EXEC [ UTE ] ] { [ @return_status = ] { procedure_name [ ;number ] | @procedure_name_var } [ [ @parameter = ] { value | @variable [ OUTPUT ] | [ DEFAULT ] } [ ,...n ] [ WITH RECOMPILE ] }
7 存储过程和触发器
7
7.1.2 用户存储过程的创建与执行
使用 WITH ENCRYPTION 选项(创建加密过程)举例 WITH ENCRYPTION 子句对用户隐藏(加密)存储过程的文本。 【例】使用 sp_helptext 系统存储过程获取关于加密过程的信息,然后尝试直接从 syscomments 表中获取关于该过程的信息。 USE XSCJ GO IF EXISTS (SELECT name FROM sysobjects WHERE name = 'encrypt_this' AND type = 'P') DROP PROCEDURE encrypt_this GO CREATE PROCEDURE encrypt_this WITH ENCRYPTION /*加密过程*/ AS SELECT * FROM XS GO 存储过程的调用: EXECUTE sp_helpyext encrypt_this /*系统存储过程sp_helpyext用于获取存储 过程的信息*/ 结果集为提示信息:对象备注已加密。
第7章 存储过程、触发器和程序包
在很多时候,都需要保存PL/SQL程序块,以便 随后可以重新使用。这也意味着,程序块需要一个名 称,这样需才可以调用或者引用它。命名的PL/SQL 程序块可被独立编译并存储在数据库中,任何与数据 库相连接的应用程序都可以访问这些存储的PL/SQL 程序块。Oracle提供了四种类型的可存储的程序:过 程、函数、触发器和程序包。
11
7.3.4 INSTEAD OF 触发器
INSTEAD OF 触发器也称替代触发器,定义 INSTEAD OF触发器后,用户对表的DML操作将不再 被执行,而是执行触发器主体中的操作。通常情况下 ,INSTEAD OF触发器是定义在视图上的,而不是在 表上定义的触发器,它是用来替换所使用实际语句的 触发器。
17
4
7.1.3 默认值
存储过程的参数也可以有默认值,这样当调用该 过程时,如果未向参数传入值,则该参数将使用定义 的默认值。例如,下面修改了ADD_EMPLOYEE存储 过程,为其中的参数提供了默认值:
SQL> create or replace procedure add_employee( 2 id_param in number, 3 name_param in varchar2, 4 job_param in varchar2 default 'SALESMAN', 5 hire_param in date default sysdate, 6 salary_param) is 7 begin 8 insert into scott.emp(empno,ename,job,hiredate,sal) 9 values(id_param,name_param,job_param,hire_param,salary_param); 10 end add_employee; 11 / 过程已创建。
存储过程和触发器
][ ,...n ] [ WITH <procedure_option>] [ ,...n ]
[ FOR REPLICATION ] AS { <sql_statement> [;][ ...n ]
| EXTERNAL NAME asse MBly_name.class_name.method_name } [;]
【例7.7】 对例7.2中创建旳存储过程student_info1进行修改,将第一种参数改 成学生旳学号。
ON c.Leabharlann 程号= b.课程号WHERE 姓名 LIKE @name
GO
执行存储过程:
EXECUTE st_info
/*参数使用默认值*/
或者
EXECUTE st_info '王%'
/*传递给@name 旳实参为'王%'*/
(5)使用OUTPUT游标参数旳存储过程。OUTPUT游标参数用于返回存储过程 旳局部游标。
/*执行旳操作*/
| EXTERNAL NAME asse MBly_name.class_name.method_name }
[;]
其中,
<procedure_option> ::=
[ ENCRYPTION ]
[ RECOMPILE ]
2.存储过程旳执行
经过EXECUTE或EXEC命令能够执行一种已定义旳存储过程,EXEC是EXECUTE旳 简写。语法格式:
3.举例
(1)设计简朴旳存储过程。 【例7.1】 返回081101号学生旳成绩情况。该存储过程不使用任何参数。 USE PXSCJ GO CREATE PROCEDURE student_info
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
7.2.1 利用SQL语句创建触发器
创建触发器都使用CREATE TRIGGER语句,但创建DML触发器和替代触发器与创建系统触发器的语法略有不同。
1.创建DML触发器 语法格式: CREATE [OR REPLACE] TRIGGER [schema.] trigger_name /*指定触发器名称*/ { BEFORE∣AFTER∣INSTEAD OF } , DELETE | INSERT | UPDATE * OF column,…n +- /*定义触发器种类*/ *OR , DELETE | INSERT | UPDATE * OF column,…n +-+ ON [schema.] {table_name∣view_name} /*指定操作对象*/ [ FOR EACH ROW [ WHEN(condition) ] ] sql_statement*…n+ /*PL/SQL块*/
【例7.6】 统计表XSB中男女同学的人数。 CREATE OR REPLACE PROCEDURE count_number ( sex IN char, num OUT number ) AS BEGIN IF sex= '男' THEN SELECT COUNT(XB) INTO num FROM XSB WHERE XB= '男'; ELSE SELECT COUNT(XB) INTO num FROM XSB WHERE XB= '女'; END IF; END; 在调用过程count_number时,需要先定义OUT类型参数,调用如下: DECLARE man_num number; BEGIN count_number('男', man_num); DBMS_OUTPUT.PUT_LINE(man_num); END; 输出结果: 12
使用存储过程的优点如下。 (1)过程在服务器端运行,执行速度快。 (2)过程执行一次后代码就驻留在高速缓冲存储器,在以后的操作中,只需从高速缓冲存储器中调 用已编译代码执行,提高了系统性能。 (3)确保数据库的安全。可以不授权用户直接访问应用程序中的一些表,而是授权用户执行访问这 些表的过程。非表的授权用户除非通过过程,否则就不能访问这些表。 (4)自动完成需要预先执行的任务。过程可以在系统启动时自动执行,而不必在系统启动后再进行 手工操作,大大方便了用户的使用,可以自动完成一些需要预先执行的任务。
【例7.1】 输出hello world。 CREATE PROCEDURE proc AS BEGIN DBMS_OUTPUT.PUT_LINE('hello world'); END;
【例7.2】 计算指定学生的总学分。 CREATE OR REPLACE PROCEDURE totalcredit ( xh IN varchar2) AS xf number; BEGIN SELECT ZXF INTO xf FROM XSB WHERE XH=xh AND ROWNUM=1; DBMS_OUTPUT.PUT_LINE(xf); END; 【例7.3】 计算某专业总学分大于40的人数,存储过程使用了一个输入参数和一 个输出参数。 CREATE OR REPLACE PROCEDURE count_grade ( zy IN char, person_num OUT number ) AS BEGIN SELECT COUNT(XH) INTO person_num FROM XSB WHERE ZY=zy AND ZXF>40; END;
2.调用存储过程
调用存储过程一般使用EXEC语句,但在PL/SQL块中可以直接使用存储过程的名称来调用。 语法格式:
[ { EXEC | EXECUTE } ] procedure_name * ( *parameter =>+ value | @variable *,…n+) + *;+ 【例7.4】 调用例7.1中的存储过程proc。 SET SERVEROUT ON; EXEC proc; 输出结果: hello world 以下命令运行的结果与之相同: BEGIN proc; END; 【例7.5】 从XSCJ数据库的XSB表中查询某人的总学分,根据总学分写评语。 CREATE OR REPLACE PROCEDURE update_info ( xh in char ) AS xf number; BEGIN SELECT ZXF INTO xf FROM XSB WHERE XH=xh AND ROWNUM=1; IF xf>50 THEN UPDATE XSB SET BZ= '三好学生' WHERE XH=xh; END IF; IF xf<35 THEN UPDATE XSB SET BZ= '学分未修满' WHERE XH=xh; END IF; END; 执行存储过程update_info: EXEC update_info(xh=>'101101');
2.创建替代触发器 创建替代触发器使用INSTEAD OF关键字,一般用于对视图的DML触发。由于视图有可能由多个表进行 关联而成,因而并非所有的关联都是可更新的。INSTEAD OF触发器触发时只执行触发器内部的SQL语句, 而不执行激活该触发器的SQL语句。 例如,若在一个多表视图上定义了INSTEAD OF INSERT触发器,视图各列的值可能允许为空也可能不 允许为空。若视图某列的值不允许为空,则INSERT语句必须为该列提供相应的值。 【例7.11】 在XSCJ数据库中创建视图stu_view,包含学生学号、专业、课程号、成绩。该视图依赖于 表XSB和CJB,是不可更新视图。可以在视图上创建INSTEAD OF触发器,当向视图中插入数据时分别向表XSB 和CJB插入数据,从而实现向视图插入数据的功能。 首先创建视图: CREATE VIEW stu_view AS SELECT XSB.XH, ZY, KCH, CJ FROM XSB, CJB WHERE XSB.XH=CJB.XH 创建INSTEAD OF触发器: CREATE TRIGGER InsteadTrig INSTEAD OF INSERT ON stu_view FOR EACH ROW DECLARE xm char(8); xb char(2); cssj date; BEGIN xm:='佚名'; xb:= '男'; cssj:= '01-1月-90'; INSERT INTO XSB(XH, XM, XB, CSSJ, ZY) VALUES(:NEW.XH,xm, xb, cssj, :NEW.ZY); INSERT INTO CJB VALUES(:NEW.XH, :NEW.KCH, :NEW.CJ); END;
3.利用OEM创建过程 如果要通过OEM定义一个存储过程 count_grade查询XSCJ数据库中某个 专业的学生人数,步骤如下。 (1)在OEM界面的“方案”属性页中选择“过 程”,单击鼠标左键,进入“过程搜索”页面。
(2)单击“创建”按钮,进入“创建 过程”页面。在“名称”文本框中指定过程 名称count_grade;在“方案”中选择建立过 程的用户方案SYSTEM。然后在“源”代码 区域,编辑PL/SQL过程语句块,如图7.1所示。 (3)代码输入编辑完成后,单击“确 定”按钮完成过程创建。 4.利用SQL Developer创建过程 如果要通过SQL Developer定义存储过程 count_grade,步骤如下。 (1)启动SQL Developer,选择 system_ora连接的Procedures节点,右击鼠 标,选择“New Procedure”菜单项进入 “Create PL/SQL Procedure”对话框,如图 7.2所示。
7.1.1 存储过程的创建和执行
1.SQL命令创建存储过程 创建存储过程的语句是CREATE PROCEDURE语句。 语法格式: CREATE [OR REPLACE] PROCEDURE [schema.]procedure_name /*定义过程名*/ * (parameter parameter_mode date_type * DEFAULT expr + *, …n+)+ /*定义参数类型及属性*/ { IS | AS } [declare_section] /*变量声明部分*/ BEGIN sql_statement /*PL/SQL过程体*/ END [procedure_name][;]
(2)在“Name”文本框中输入存储过程的名称,单击“+”按钮添加一个参 数,在“Name”栏输入参数名称,在“Type”栏选择参数的类型,在“Mode”栏 选择参数的模式,在“Default Value”栏输入参数默认值。 (3)单击“确定”按钮,在COUNT_GRADE过程的编辑框中编写过程语句块, 完成后单击 按钮完成过程的创建。 7.1.2 存储过程的编辑修改 修改存储过程和修改视图一样,虽然也有ALTER PROCEDURE语句,但是它是用 于重新编译或验证现有过程的。如果要修改过程定义,仍然使用CREATE OR REPLACE PROCEDURE命令,语法格式一样。 其实,修改已有过程本质就是使用CREATE OR REPLEACE PROCEDURE重新创建一 个新的过程,保持名字和原来的相同。 使用界面方式也可很方便地修改存储过程定义。在OEM的“搜索过程”页面中, 搜索出要修改的存储过程,选中后单击“编辑”按钮,在“编辑过程”页面中修改 定义存储过程的PL/SQL语句,单击“应用”按钮就完成修改了。 7.1.3存储过程的删除 当某个过程不再需要时,应将其删除,以释放它占用的内存资源。 语法格式: DROP PROCEDURE [schema.] procedure_name; 其中,schema是包含过程的用户;procedure_name是将要删除的存储过程名 称。 【例7.7】 删除XSCJ数据库中的count_number存储过程。 DROP PROCEDURE count_num;