数据库 第7章 存储过程和触发器
存储过程和触发器

信息技术系
INSERT触发器
[例2] 当向orders表中插入一条订单时,检查goods表中该订 单中的库存量够不够,如不够,则不能下订单;如够,则 还要减去goods表中相应的库存量。 CREATE TRIGGER tr3 ON orders AFTER INSERT AS declare @x int,@y varchar(6),@z int select @y=货品名称,@z=数量 from inserted select @x=库存量 from goods where 货品名称=@y if @x<@z begin print '库存不够,不能下订单' rollback transaction end else update goods set 库存量=库存量-@z where 货品名称=@y
信息技术系
7.1.3 用户自定义存储过程
2. 带参数的存储过程 [例1]创建一个存储过程,显示某货品的订单信息。该存储 过程带有一个参数,用于接受货品名称。 (注意:形式参数的定义和实际参数的使用) create procedure sp2 @x varchar(6) as select * from orders where 货品名称=@x go execute sp2 ‘book’ --执行存储过程 --或者execute sp2 @x=‘book’ 实参的使用
SQL Server 2012 数据库教程第7章 存储过程和触发器

① 存储过程:存储过程保存T-SQL语句集合,可以接收和返回用户提供的参 数。
② CLR存储过程:CLR存储过程是对Microsoft .NET Framework公共语言运行时 (CLR)方法的引用,可以接收和返回用户提供的参数。
则创建完成,如图7.4所示。
2.执行存储过程 在pxscj数据库的“存储过程”目录下选择要执行的存储过程,如 student_info1,右键单击鼠标,选择“执行存储过程”菜单项。在弹出的“执行 过程”窗口中会列出存储过程的参数形式,如果“输出参数”栏为“否”,则表
以下命令的执行结果与上面的相同:
EXECUTE student_info1 @name='王林', @cname='计算机基础'
或者: DECLARE @proc char(20) SET @proc= 'student_info1' EXECUTE @proc @name='王林', @cname='计算机基础'
接下来执行存储过程do_action来查看结果: DECLARE @str char(8) EXEC dbo.do_action 0, @str OUTPUT SELECT @str; 执行结果显示“修改成功”。
Hale Waihona Puke 4)使用带有通配符参数的存储过程【例7.4】 从3个表的连接中返回指定学生的学号、姓名、所选课程名称及该
在如下的批处理中,声明一个局部游标变量,执行上述存储过程,并将游标 赋值给局部游标变量,然后通过该游标变量读取记录。
网络数据库SQL Server 2012教程第7章 存储过程与触发器

目录
目录
7.1 存储过程
7.1.1 存储过程概述 存储过程的概念
存储过程(Stored Proce完成特定功能的T-SQL语句集合。存储过程 存储在数据库内,可以有用户的应用程序,通过指定存储 过程名称及相关参数来执行。
7.1 存储过程
7.1.2 创建存储过程
USE StuInfo GO CREATE PROCEDURE Search_2 @name char(10) --@name char(10):定义参数 AS BEGIN SELECT S.学号 , S.姓名 ,Sc.成绩 , C .课程名 FROM Student AS S INNER JOIN Score AS Sc ON S.学号 = Sc.学号 INNER JOIN Course AS C ON Sc.课程号 = C.课程号 WHERE S.姓名 = @name END
7.1.2 创建存储过程
USE StuInfo GO CREATE PROCEDURE Search_1 AS BEGIN SELECT Student.学号 , Student.姓名 ,Score.成绩 , Course .课程名 FROM Student INNER JOIN Score ON Student.学号 = Score.学号 INNER JOIN Course ON Score.课程号 = Course.课程号 WHERE Student.姓名 = '祁鹏' END
7.1 存储过程
7.1.1 存储过程概述 存储过程的优点:
1.模块化的程序设计,实现代码多次调用。存储过程只需 创建一次,并存储在数据库中,
在以后的使用中,便可重复调用,不需要每次重新编写。
SQL Server 2005数据库应用技术第7章 存储过程与触发器

7.1 存储过程概述 2.存储过程的功能特点
7.1 存储过程
概述
7.2 创建与管理 存储过程 7.3 触发器概述 7.4 创建与管理 触发器
SQL Server中的存储过程可以实现以下功能: ① 接收输入参数并以输出参数的形式为调用过程 或批处理返回多个值。 ② 包含执行数据库操作的编程语句,包括调用其 他过程。 ③ 为调用过程或批处理返回一个状态值,以表示 成功或失败(及失败原因)。
概述
7.2 创建与管理 存储过程 7.3 触发器概述 7.4 创建与管理 触发器
7.2 创建与管理存储过程
7.1 存储过程
概述
7.2 创建与管理 存储过程 7.3 触发器概述 7.4 创建与管理 触发器
在SQL Server 2005中,可以使用SQL Server管理平台 或者T-SQL语句CREATE PROCEDURE来创建存储过 程。存储过程在创建后,可以根据需要调用执行、修改 和删除。
SQL Server存储过程可分为四类:系统存储过 程、用户自定义存储过程、临时存储过程、扩 展存储过程。
7.1 存储过程概述 1.存储过程的类型
7.1 存储过程
概述
7.2 创建与管理 存储过程 7.3 触发器概述 7.4 创建与管理 触发器
(1)系统存储过程 系统存储过程是指由系统提供的存储过程,主要存储在 master数据库中并以sp_为前缀,它从系统表中获取信 息,从而为系统管理员管理SQL Server提供支持。 (2)用户定义存储过程 用户定义存储过程是由用户创建并能完成某一特定功能 (例如查询用户所需数据信息)的存储过程。它处于用 户创建的数据库中,存储过程名前没有前缀sp_。本章 所涉及的存储过程主要是指用户定义存储过程。
第7章 存储过程 触发器

7.1.1 Transact-SQL程序的结构与批处理
Transact-SQL程序的结构
以下程序是打开教学管理数据库TEACH,并从数据 表SC中读取学号为“S1”同学所学课程的平均分, 如果该平均分大于或等于60分,则程序输出“课程 平均成绩超过60”,否则输出“课程平均成绩不超 过60”。
3
/*Transact-SQL程序的实例*/
USE Teach
/*将教学管理数据库Teach置为当前数据库*/
GO
DECLARE @AvgScore DECIMAL /*定义变量AvgScore */
SET @AvgScore=60
/*给变量AvgScore赋值初值*/
IF(SELECT AVG(Score) FROM SC WHERE SNo='S1')>=@AvgScore
CREATE PROCEDURE QueryTeach ( @sno varchar(6),@sn varchar(20) OUTPUT,@dept varchar(20) OUTPUT ) AS begin if exists(select * from s where sno=@sno)
SELECT @sn=SN,@dept=Dept FROM S WHERE SNo=@sno else print '该学号:' + @sno + ' 不存在' end
17
触发器的种类
AFTER触发器
AFTER触发器是告诉SQL语句执行了INSERT、UPDATE 或者DELETE操作后干什么。
INSTEAD OF触发器
告诉当要执行INSERT、UPDATE或DELETE操作时用什么 别的操作来代替。
第7章 存储过程、触发器和程序包-4

9
7.1.3 默认值
注意:只有IN参数才具有默认值,OUT和IN OUT参数 都不具有默认值。 在为参数定义默认值时,一般建议:将没有默认值的 参数放在参数列表的开始位置,其后是OUT类型的参 数,然后是IN OUT类型的参数,最后才是具有默认值 的IN参数。
10
7.1.4 过程中的事务处理
当在SQL*Plus中进行操作时,用户可以使用 COMMIT语句将在事务中的所有操作“保存”到数据库 中。如果用户需要撤销所有的操作,则可以使用 ROLLBACK语句回退事务中未提交的操作,使数据库返回 到事务处理开始前的状态。在PL/SQL过程中,不仅可以 包括插入和更新这类的DML操作,还可以包括事务处理 语句COMMIT和ROLLBACK。
7.3.3 行级触发器
在创建触发器时,如果使用了FOR EACH ROW选项, 则创建的该触发器为行级触发器。对于行级触发器而 言,当一个DML语句操作影响到数据库中的多行数据 时,行级触发器会针对于每一行执行一次。 重要特点 当创建BEFORE行级触发器时,可以在触发器中引用 受到影响的行值,甚至可以在触发器中设置它们。
26
7.4 程序包
程序包其实就是被组合在一起的相关对象的集合, 当程序包中任何函数或存储过程被调用时,程序包就被 加载入到内存中,这样程序包中的任何函数或存储过程 的子程序访问速度将大大加快。例如,在PL/SQL程序 中,为了输出运行结果,在程序的代码中使用了 DBMS_OUTPUT.PUT_LINE语句。事实上,这是调用程 序包DBMS_OUTPUT中的PUT_LINE过程。 DBMS_OUTPUT程序包的主要功能就是在PL/SQL程序 中进行输入和输出。 程序包由两个部分组成:规范和包主体。规范中描述程 序包所使用的变量、常量、游标和子程序,包主体完全 定义子程序和游标。 27
数据库中的存储过程与触发器
数据库中的存储过程与触发器数据库是一个用于存储和管理大量数据的集合,而存储过程和触发器作为数据库中的两种重要对象,在实际的数据库应用中发挥着重要的作用。
本文将详细介绍数据库中的存储过程和触发器的定义、作用以及使用方式,并对它们在实际应用中的优势进行探讨。
存储过程是一组预编译的SQL语句集合,这些语句经过编译并且存储在数据库中,以便后续的重用。
存储过程可以接受参数,并且通过执行一系列SQL语句来实现复杂的操作。
存储过程的主要作用包括提高数据库的性能、减少网络流量、实现封装和重用性。
首先,存储过程可以提高数据库的性能。
当执行一组SQL语句时,存储过程会将这些语句一次性发送给数据库服务器,并且在服务器上进行预编译和优化。
相比于每次发送单独的SQL语句,存储过程能够减少网络往返的时间,提高执行效率。
其次,存储过程能够减少网络流量。
由于存储过程的执行过程在数据库服务器上完成,它只需要将执行结果返回给客户端,而不需要将整个SQL语句和数据传输回客户端。
这样不仅减少了网络传输的数据量,还减少了网络请求的次数,有效降低了网络流量。
此外,存储过程实现了封装和重用性的特点。
通过将一系列SQL语句封装在一个存储过程中,可以减少代码的重复性,提高代码的可维护性。
同时,存储过程可以在不同的应用程序中被调用,实现了代码的重用性,提高了开发效率。
在实际应用中,存储过程常用于完成复杂的业务逻辑。
例如,在某电商网站的订单系统中,存储过程可以用于完成下单流程的各个环节,包括生成订单、更新库存、计算订单总价等。
通过使用存储过程,可以确保这些操作的原子性,避免了在应用层面上进行多个SQL语句的事务管理。
另一个重要的数据库对象是触发器。
触发器是数据库中的一类特殊对象,它与表相关联,并且在特定的事件发生时自动执行一些操作。
触发器的主要作用包括数据完整性的维护、业务规则的实施以及数据审计等。
首先,触发器能够维护数据的完整性。
通过在数据操作之前或之后触发相应的操作,触发器可以保证数据库中的数据满足特定的约束条件。
SQL Server 2008数据库应用教程第7章 存储过程、触发器、游标及事务
0
FETCH 命令成功执行
-1
FETCH 命令失败或此行不在结果集中
-2
所提取的数据不存在
图7-9 利用游标遍历显示整个结果集
7.4 事务
7.4.1 显式事务的处理
1.BEGIN TRANSACTION 2.COMMIT TRANSACTION 3.ROLLBACK TRANSACTION
7.1.2 使用CREATE PROCEDURE 语句创建存储过程
1.创建简单存储过程 2.使用带有参数的存储过程 3.使用带有通配符参数的存储过程 4.使用OUTPUT参数
图7-1 执行带输出参数的存储过程
7.1.3 执行存储过程
执行例7-1所创的存储过程“SEL_销 售总金额”,结果如图7-2所示。
图7-7 例7-22执行情况
图7-8 利用游标修改表中的数据
7.3.3 关于@@FETCH_STATUS
@@FETCH_STATUS返回针对连接 当前打开的任何游标发出的上一条游标 FETCH 语句的状态,具体返回值及描述 如表7-2所示。
表7-2 @@FETCH_STATUS的返回值及描述
第7章 存储过程、触发器、游标及事务
7.1
存储过程
7.2
触发器
7.3
游标
7.4
事务
7.1 存储过程
7.1.1 存储过程概述
1.认识存储过程 2.存储过程的优点 3.存储过程的分类
(1)存储过程已在服务器注册。 (2)存储过程可以强制应用程序的安全性。
(3)允许进行模块化程序设计。 (4)存储过程是命名代码,允许延迟绑定。 (5)存储过程可以降低网络负载。
7.4.2 隐式事务
Oracle数据库管理与开发第7章 存储过程和触发器
锁机制和死锁
2.死锁 当两个或者多个用户等待其中一个被锁住的资源时,就有可能发生死锁现 象。对于死锁,Oracle自动进行定期搜索,通过回滚死锁中包含的其中一个语 句来解决死锁问题,也就是释放其中一个冲突锁,同时返回一个消息给对应的 事务。用户在设计应用程序时,要遵循一定的锁规则,尽力避免死锁现象的发 生。
当一个触发器不再使用时,要从内存中删除它。语法:
删除:DROP TRIGGER my_trigger;
当一个触发器已经过时,想重新定义时,不必先删除再创建,同样只需在CREATE语句后面 加上OR REPLACE关键字即可。如:
重新定义:CREATE OR REPLACE TRIGGER my_trigger;
01
存储过程
02
触发器
03
事务
04
锁
1
存储过程
主要内容
01
存储过程的创建和执行
存储过程的修改
02
03
存储过程的删除
存储过程的创建和执行
1.创建存储过程 创建存储过程的语句是CREATE PROCEDURE,语法格式: create [or replace] procedure pro_name [(parameter1[,parameter2]…)] is|as begin plsql_sentences; [exception] [dowith _ sentences;] end [pro_name];
语句 INSERT UPDATE TX TX
类型
模式 独占(6)(X) 独占(6)(X)
DELETE
SELECT FOR UPDATE
TX
TX
独占(6)(X)
独占(6)(X)
第7章事务存储过程触发器和游标精品PPT课件
TRUNCATE TABLE GRANT
REVOKE
INSERT
UPDATE
DELETE
SELECT
OPEN
FETCH
需要关闭隐式事务模式时,调用SET语句关闭
IMPLICIT_TRANSACTIONS 连接选项即可。
第7章事务、存储过程、触发器和游标
3) 自动事务模式
在自动事务模式下,当一个语句被成功执行后,它被 自动提交,而当它执行过程中产生错误时,被自动回滚。 自动事务模式是SQL Server的默认事务管理模式,当与 SQL Server建立连接后,直接进入自动事务模式,直到使 用BEGIN TRANSACTION语句开始一个显式事务,或者打开 IMPLICIT_TRANSACTIONS 连接选项进入隐式事务模式为止。
第7章事务、存储过程、触发器和游标
关于嵌套事务:
说明:在定义一个事务时,BEGIN TRANSACTION语 句应与COMMIT TRANSACTION语句或ROLLBACK TRANSACTION成对出现。在SQL Server中,显示事务定义 语句可以嵌套.一个嵌套的事务是一系列子事务ti的集合, T={t1,t2,…,tn},这些子事务中的每一个又可以是拥有它自己的 事务.T能够决定子事务ti的启动和终止,反过来,如果T中的一个 子事务ti终止,它强制T终止;如拖ti提交,这一动作并不能使ti成 为永久的,如果T终止(回滚),那么ti的提交将被撤消.
SET TRANSACTION ISOLATION LEVEL{ READ UNCOMMITTED |READ COMMITTED |REPEATED READ |SERIALIZATION
}
第7章事务、存储过程、触发器和游标
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(3)用户存储过程。在SQL Server 2008中,用户存储过程可以使用T-SQL语言 编写,也可以使用CLR方式编写。在本书中,T-SQL存储过程就称为存储过程。 ① 存储过程:存储过程保存T-SQL语句集合,可以接收和返回用户提供的参数。 存储过程中可以包含根据客户端应用程序提供的信息,以及在一个或多个表中插入 新行所需的语句。存储过程也可以从数据库向客户端应用程序返回数据。 例如,电子商务Web应用程序可能根据联机用户指定的搜索条件,使用存储过 程返回有关特定产品的信息。 ② CLR存储过程:CLR存储过程是对Microsoft .NET Framework公共语言运行时 (CLR)方法的引用,可以接收和返回用户提供的参数。它们在“.NET Framework 程序集”中是作为类的公共静态方法实现的。简单地说,CLR存储过程就是可以使 用Microsoft Visual Studio 2008环境下的语言作为脚本编写的、可以对Microsoft .NET Framework公共语言运行时(CLR)方法进行引用的存储过程。编写CLR存储过程需 要有C#语言的基础,本书将在附录D中具体介绍编写CLR存储过程和CLR触发器的方 法。
1.使用T-SQL命令创建存储过程 .使用 命令创建存储过程
创建存储过程的语句是CREATE PROCEDURE或CREATE PROC,两者同义。 语法格式: CREATE { PROC | PROCEDURE } [schema_name.] procedure_name [ ; number] /*定义过程名*/ [ { @parameter [ type_schema_name. ] data_type } /*定义参数的类型*/ [ VARYING ] [ = default ] [ OUT | OUTPUT ] [READONLY] /*定义参数的属性*/ ][ ,...n ] [ WITH <procedure_option>] [ ,...n ] /*定义存储过程的处理方式*/ [ FOR REPLICATION ] AS { <sql_statement> [;][ ...n ] /*执行的操作*/ | EXTERNAL NAME asse MBly_name.class_name.method_name } [;] 其中, <procedure_option> ::= [ ENCRYPTION ] [ RECOMPILE ]
第二个存储过程: CREATE PROCEDURE do_action @X bit, @STR CHAR(8) OUTPUT AS BEGIN EXEC do_insert IF @X=0 BEGIN UPDATE XSB SET 姓名='刘英', 性别=0 WHERE 学号='091201' SET @STR='修改成功' END ELSE IF @X=1 BEGIN DELETE FROM XSB WHERE 学号='091201' SET @STR='删除成功' END END
2.存储过程的执行 .
通过EXECUTE或EXEC命令可以执行一个已定义的存储过程,EXEC是EXECUTE的 简写。语法格式: [ { EXEC | EXECUTE } ] { [ @return_status = ] { module_name [ ;number] | @module_name_var } [ [ @parameter = ] { value | @variable [ OUTPUT ] | [ DEFAULT ] }] [ ,...n ] [ WITH RECOMPILE ] } [;]
(6)使用WITH ENCRYPTION选项。WITH ENCRYPTION子句用于对用户隐藏存 储过程的文本。 【例7.6】 创建加密过程,使用 sp_helptext 系统存储过程获取关于加密过程 例 的信息,然后尝试直接从 syscomments 表中获取关于该过程的信息。 CREATE PROCEDURE encrypt_this WITH ENCRYPTION AS SELECT * FROM XSB 通过系统存储过程sp_helptext可显示规则、默认值、未加密的存储过程、用户 定义函数、触发器或视图的文本。 执行如下语句: EXEC sp_helptext encrypt_this 结果集为提示信息“对象'encrypt_this'的文本已加密”。
(2)使用带参数的存储过程。 【例7.2】 从PXSCJ数据库的三个表中查询某人指定课程的成绩和学分。该存储 例 过程接收与传递参数精确匹配的值。 USE PXSCJ GO CREATE PROCEDURE student_info1 @name char (8), @cname char(16) AS SELECT a.学号, 姓名, 课程名, 成绩, t.学分 FROM XSB a INNER JOIN CJB b ON a.学号 = b.学号 INNER JOIN KCB t ON b.课程号= t.课程号 WHERE a.姓名=@name and t.课程名=@cname GO
(5)使用OUTPUT游标参数的存储过程。OUTPUT游标参数用于返回存储过程 的局部游标。 【例7.5】 在 PXSCJ数据库的XSB表上声明并打开一个游标。 例 CREATE PROCEDURE st_cursor @st_cursor cursor VARYING OUTPUT AS SET @st_cursor = CURSOR FORWARD_ONLY STATIC FOR SELECT * FROM XSB OPEN @st_cursor
(3)使用带OUPUT参数的存储过程。 【例7.3】 创建一个存储过程do_insert,作用是向XSB表中插入一行数据。创 例 建另外一个存储过程do_action,在其中调用第一个存储过程,并根据条件处理该 行数据,处理后输出相应的信息。 第一个存储过程: CREATE PROCEDURE dbo.do_insert AS INSERT INTO XSB VALUES('091201', '陶伟', 1, '1990-03-05', '软件工程',50, NULL);
使用ALTER PROCEDURE命令可修改已存在的存储过程并保留以前赋予的许可。 语法格式: ALTER { PROC | PROCEDURE } [schema_name.] procedure_name [ ; number] [ { @parameter [ type_schema_name. ] data_type } [ VARYING ] [ = default ] [ OUT[PUT] ] ][ ,...n ] [ WITH <procedure_option>] [ ,...n ] [ FOR REPLICATION ] AS { <sql_statement> [;][ ...n ] | EXTERNAL NAME asse MBly_name.class_name.method_name } [;]
3.举例 .
(1)设计简单的存储过程。 【例7.1】 返回081101号学生的成绩情况。该存储过程不使用任何参数。 例 USE PXSCJ GO CREATE PROCEDURE student_info AS SELECT * FROM CJB WHERE 学号= '081101' GO 存储过程定义后,执行存储过程student_info: EXECUTE student_info 如果该存储过程是批处理中的第一条语句,则可使用 student_info 执行结果如下:
在如下的批处理中,声明一个局部游标变量,执行上述存储过程,并将游标 赋值给局部游标变量,然后通过该游标变量读取记录。 DECLARE @MyCursor cursor EXEC st_cursor @st_cursor = @MyCursor OUTPUT /*执行存储过程*/ FETCH NEXT FROM @MyCursor WHILE (@@FETCH_STATUS = 0) BEGIN FETCH NEXT FROM @MyCursor END CLOSE @MyCursor DEALLOCATE @MyCursor
接下来执行存储过程do_action来查看结果: DECLARE @str char(8) EXEC dbo.do_action 0, @str OUTPUT SELECT @str; 执行结果如下:
(4)使用带有通配符参数的存储过程。 【例7.4】 从三个表的连接中返回指定学生的学号、姓名、所选课程名称及该 例 课程的成绩。该存储过程在参数中使用了模式匹配,如果没有提供参数,则使用 预设的默认值。 CREATE PROCEDURE st_info @name varchar(30) = '李%' AS SELECT a.学号,a.姓名,c.课程名,b.成绩 FROM XSB a INNER JOIN CJB b ON a.学号 =b.学号 INNER JOIN KCB c ON c.课程号= b.课程号 WHERE 姓名 LIKE @name GO 执行存储过程: EXECUTE st_info /*参数使用默认值*/ 或者 EXECUTE st_info '王%' /*传递给@name 的实参为'王%'*/
7.1 存储过程 7.2 触发器
在SQL Server 2008中,使用T-SQL语句编写存储过程。存储过程可以接收输入 参数、返回表格或标量结果和消息,调用“数据定义语言(DDL)”和“数据操 作语言(DML)”语句,然后返回输出参数。使用存储过程的优点如下: (1)存储过程在服务器端运行,执行速度快。 (2)存储过程执行一次后,就驻留在高速缓冲存储器,在以后的操作中, 只需从高速缓冲存储器中调用已编译好的二进制代码执行,提高了系统性能。 (3)使用存储过程可以完成所有数据库操作,并可通过编程方式控制对数 据库信息访问的权限,确保数据库的安全。 (4)自动完成需要预先执行的任务。存储过程可以在SQL Server启动时自动 执行,而不必在系统启动后再进行手工操作,大大方便了用户的使用,可以自动 完成一些需要预先执行的任务。