第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
存储过程触发器和数据完整性课件
触发器应用案例
总结词
自动、高效、保证数据一致性
详细描述
触发器是一种自动执行的数据完整性束缚机制,可以在数据库中实现数据一致性的保证。当数据库中 产生插入、更新或删除操作时,触发器会自动触发并执行相关的操作,以保证数据的一致性和完整性 。同时,触发器还可以提高数据库的性能和响应速度。
数据完整性应用案例
触发器通常用于在数据库中维护数据 完整性,通过监控对表执行的更改操 作,并采取相应的措施来确保数据的 准确性和一致性。
触发器类型
01
02
03
04
根据事件类型,触发器可以分 为插入触发器、删除触发器和
更新触发器。
插入触发器:当在表中插入新 记录时触发。
删除触发器:当从表中删除记 录时触发。
更新触发器:当修改表中记录 的数据时触发。
触发器与数据完整性
REPORTING
触发器对数据完整性的影响
触发器可以用于禁止对数据库 的非法修改,从而维护数据的 完整性。
触发器可以用于在数据修改时 自动进行一些附加操作,例如 记录日志或计算衍生值。
触发器可以用于强制执行一些 业务规则,例如检查新插入的 数据是否符合特定的条件。
如何通过触发器实现数据完整性
感谢观看
REPORTING
加灵活地实现自动化的数据处理操作。 • 在保护数据完整性和安全性方面,存储过程和触发器都可以发挥重要作用。通过使用参数化查询、束缚、校验
等机制,可以有效地防止SQL注入攻击和数据的不完整性和错误。同时,使用日志和特殊处理机制可以更好地 记录操作日志和特殊信息,以便于后期审计和故障排查。
PART 06
由用户创建,根据特定业 务需求编写,用于执行自 定义的业务逻辑。
第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
第07章存储过程和触发器
山东工商学院
陈章良
7.1.2 用户存储过程的创建与执行
(2)存储过程的执行 语 法 格 式
[ EXEC [ UTE ] ] { [ @return_status = ] { procedure_name [ ;number ] | @procedure_name_var } [ [ @parameter = ] { value | @variable [ OUTPUT ] | [ DEFAULT ] } [ ,...n ] [ WITH RECOMPILE ] }
山东工商学院
陈章良
7.1.4 用户存储过程的删除
语法格式
DROP PROCEDURE { procedure } [ ,...n ]
【例7.10】删除 PXSCJ数据库中的student_info1 存储过程。 USE PXSCJ GO DROP PROCEDURE student_info1
山东工商学院
CREATE PROCEDURE student_info AS SELECT a.xh,xm,kcm,cj,xf FROM XSB a JOIN CJB b ON a.xh=b.xh JOIN KCB t ON b.kch= t.kch GO
山东工商学院
陈章良
7.1.2 用户存储过程的创建与执行
3) 使用带OUTPUT参数的存储过程
山东工商学院
陈章良
7.1.2 用户存储过程的创建与执行
(3)举例 1) 设计简单的存储过程
【例7.1】从XSCJ USE PXSCJ 数据库的三个表中查 /*检查是否已存在同名的存储过程,若有,删除*/ 询,返回学生学号、 IF EXISTS (SELECT name FROM sysobjects WHERE name = 'student_info' AND type='P') 姓名、课程名、成绩、 DROP PROCEDURE student_info 学分。该存储过程不 GO 使用任何参数。 /*创建存储过程*/
《存储过程与触发器》课件
触发器适用于需要实时响应数据变化、自动执行数据关联操作的场景。
存储过程和触发器的区别和联系
1
区别
存储过程是主动调用,触发器是被动触发;
联系
2
存储过程可以接受参数,触发器不能。
存储过程和触发器都是数据库中的可调用代 码,都可以实现数据的处理和逻辑的实现。
示例和案例
示例一
使用存储过程实现用户权限管理, 提高系统的安全性。
示例二
使用触发器实现订单状态的自动更 新,提升客户服务效率。
案例
存储过程和触器在电子商务平台 的应用,优化数据处理流程。
触发器的定义和作用
1 定义
2 作用
触发器是与数据库表相关联的一段代码,当表上 的特定事件发生时自动执行。
触发器可以用于实现数据的自动更新、数据的完 整性约束、审计和日志记录等功能。
存储过程的优点和用途
1 优点
存储过程可以减少网络通信的开销,提高数据库性能;可以保护数据的安全性,防止数 据被非法访问。
《存储过程与触发器》 PPT课件
存储过程和触发器是数据库中重要的功能模块。本课件将介绍存储过程和触 发器的定义、作用、优点、用途以及它们的使用场景、区别和联系,并提供 实例和案例。
存储过程的定义和作用
1 定义
2 作用
存储过程是一段预先编写好并存储在数据库中的 可被多次调用的代码块。
存储过程可以实现数据的封装和重复使用,提高 数据库的性能和安全性。
2 用途
存储过程常用于数据的复杂计算、数据的批量处理、数据的备份和还原等场景。
触发器的优点和用途
1 优点
2 用途
触发器可以自动执行,无需手动触发;可以实现 数据的实时更新,保证数据的一致性。
存储过程与触发器(超详细)
第八章存储过程与触发器在SQL Server 2008中存储过程和触发器是两个重要的数据库对象。
使用存储过程,可以将Transact-SQL语句和控制流语句预编译到集合并保存到服务器端,它使得管理数据库、显示关于数据库及其用户信息的工作更为容易。
而触发器是一种特殊类型的存储过程,在用户使用一种或多种数据修改操作来修改指定表中的数据时被触发并自动执行,通常用于实现复杂的业务规则,更有效地实施数据完整性。
本章学习目标了解存储过程的作用及类型掌握存储过程的创建及应用熟悉存储过程的管理了解触发器的作用及分类熟悉各种类型触发器的创建了解嵌套、递归触发器熟悉触发器的管理8.1 认识存储过程Transact-SQL语句是应用程序与SQL Server数据库之间的主要编程接口,大量的时间将花费在Transact-SQL语句和应用程序代码上。
在很多情况下,许多代码被重复使用多次,每次都输入相同的代码不但繁琐,更由于在客户机上的大量命令语句逐条向SQL Server发送将降低系统运行效率。
因此,SQL Server提供了一种方法,它将一些固定的操作集中起来由SQL Server数据库服务器来完成,应用程序只需调用它的名称,将可实现某个特定的任务,这种方法就是存储过程。
下面将详细介绍存储过程的概念、特点、创建、执行等内容。
8.1.1 存储过程概述SQL Server中T-SQL语言为了实现特定任务而将一些需要多次调用的固定的操作编写成子程序并集中以一个存储单元的形式存储在服务器上,由SQL Server数据库服务器通过子程序名来调用它们,这些子程序就是存储过程。
存储过程是一种数据库对象,存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量、有条件执行,具有很强的编程功能。
存储过程可以使用EXECUTE语句来运行。
在SQL Server中使用存储过程而不使用存储在客户端计算机本地的T-SQL程序有以下几个方面的好处。
第07章存储过程和触发器
(6) 使用 WITH ENCRYPTION 选项
WITH ENCRYPTION 子句对用户隐藏存储过程的文本。 【例7.6】创建加密过程,使用 sp_helptext 系统存储过程获取关于加 密过程的信息,然后尝试直接从 syscomments 表中获取关于该过程的 信息。 IF EXISTS (SELECT name FROM sysobjects WHERE name = 'encrypt_this' AND type = 'P') DROP PROCEDURE encrypt_this GO USE XSCJ GO CREATE PROCEDURE encrypt_this WITH ENCRYPTION AS SELECT * FROM XS GO
2013-7-12
12
几点注意: 用户定义的存储过程只能定义在当前数据库中 用户创建的存储过程归数据库所有者(dbo)拥有 创建存储过程创建的三种方法: T-SQL 企业管理器 向导
2013-7-12
13
1.通过SQL命令创建存储过程 1) 创建存储过程 语法格式: CREATE PROC [ EDURE ] procedure_name [ ; number ] /*定义过程名*/ [ { @parameter data_type } /*定义参数的类型*/ [ VARYING ] [ = default ] [ OUTPUT ] ] /*定义参数的属性*/ [ ,...n] [ WITH { RECOMPILE | ENCRYPTION |}] /*定义存储过程的处理方式*/ [ FOR REPLICATION ] AS sql_statement [ ...n ] /*执行的操作*/
存储过程与触发器.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
实验7-存储过程和触发器的使用
实验7 存储过程和触发器的使用1.存储过程①创建存储过程,使用Employees表中的员工人数来初始化一个局部变量,并调用这个存储过程USE YGGLGOCREATE PROCEDURE TEST@NU MBER int OUTPUTASBEGINDECLARE@NU MBER2inTSET@NU MBER2=(SELECT COUNT(*)FROM Employees)SET@NU MBER1=@NU MBER2END②创建存储过程,比较两个员工的实际收入,若前者比后者高就输出0,否则输出1 BEGINDECLARE@SR1float,@SR2FLOATSELECT@SR1=InCome-OutCome FROM Salary WHERE EmployeeID=@ID1SELECT@SR2=InCome-OutCome FROM Salary WHERE EmployeeID=@ID2IF@ID1>@ID2SET@BJ=0ELSESET@BJ=1END③创建添加职员记录的存储过程EmployeeAddUSE YGGLGOCREATE PROCEDURE EmployeeAdd(@employeeid char(6),@name char(10),@education char(4),@birthday datetime, @woekyear tinyint,@sex bit,@address char(40),@phonenumber char(12),@departmentID char(3))ASBEGININSERT INTO EmployeesVALUES(@employeeid,@name,@education,@birthday,@woekyear,@sex,@address,@phonenumber,@departmentID)ENDRETURNGO④创建带有OUTPUT游标参数的存储过程,在Employees表中声明并打开游标USE YGGLGOCREATE PROCEDURE em_cursor@em_cursor cursor VARYING OUTPUTASBEGINSET@em_cursor=CURSOR FORWARD_ONLY STATICFORSELECT*FROM EmployeesOPEN@em_cursorENDGO⑤创建存储过程,使用游标确定一个员工的实际收入是否排在前三名,结果为1表示是,结果为0表示否REATE PROCEDURE TOP_THREE@EM_ID char(6),@OK bit OUTPUTASBEGINDECLARE@X_EM_ID char(6)DECLARE@ACT_IN int,@SEQ intDECLARE SALARY_DIS cursor FORSELECT EmployeeID,InCome_OutComeFROM SalaryORDER BY InCome_OutCome DESCSET@SEQ=0SET@OK=0OPEN SALARY_DISFETCH SALARY_DIS INTO@X_EM_ID,@ACT_INWHILE@SEQ<3 AND@OK=0BEGINSET@SEQ=@SEQ+1IF@X_EM_ID=@EM_IDSET@OK=1FETCH SALARY_DIS INTO@X_EM_ID,@ACT_INENDCLOSE SALARY_DISDEALLOCATE SALARY_DISEND2.触发器①向Employees表插入或修改一个记录时,通过触发器检查记录的DpartmentID值在Dpartments表中是否存在,若不存在,则取消插入或修改操作USE YGGLGOCREATE TRIGGER EmployeesIns ONFOR INSERT,UPDATEASBEGINIF((SELECT DepartmentID from inserted)NOT IN(SELECT DepartmentID FROM DepartmentS))ROLLBACKEND②修改Dpartments表“DpartmentID”字段值时,该字段在Employees表中对应的值也做相应修改USE YGGLUSE YGGLGOCREATE TRIGGER DepartmentUpdate ONFOR UPDATEASBEGINUPDATE EmployeesSET DepartmentID=(SELECT DepartmentID FROM insered)WHERE DepartmentID=(SELECT DepartmentID FROM deleted)ENDGO③删除Dpartment表中记录的同时删除该记录“DpartmentID”字段值在Employees表中对应的记录CREATE TRIGGER DepartmentsDelate ONFOR DELETEASBEGINDELETE FROM EmployeesWHERE DepartmentID=(SELECT DepartmentID FROM deleted)ENDGO④创建INSTEAD OF 触发器,当向Salary表中插入记录时,先检查EmployeeID列上的值在Employees中是否存在,如果在则执行插入操作,如果不存在,则提示“员工号不存在”CREATE TRIGGER EM_EXISTS ON SalaryINSTEAD OF INSERTASBEGINDECLARE@EmployeeID char(6)SELECT@EmployeeID=EmployeeIDFROM insertedIF(@EmployeeID IN(SELECT EmployeeID FROM Employee))INSERT INTO Salary SELECT*FROM insertedELSEPRINT'员工号不存在'END⑤创建DDL触发器,当删除YGGLXJ数据库的一个表时,提示“不能删除表”,并回滚删除表的操作USE YGGLGOCREATE TRIGGER table_deleteON DATABASEAFTER DROP_TABLEASPRINT'不能删除该表'ROLLBACK TRANSACTION。
存储过程和触发器课件
触发器的主要作用是用于在数据表上 自动执行一系列操作,以确保数据的 完整性和一致性。
触发器的分类与触发事件
分类
根据触发时机,触发器可分为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;
触发器的参数与返回值
存储过程和触发器课件
• 存储过程概述 • 存储过程的创建与使用 • 存储过程的调试与优化 • 触发器概述 • 触发器的创建与使用 • 触发器的调试与优化
存储过程和触发器
][ ,...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
SQL课件存储过程和触发器
数据处理
适用于复杂的数据操作、数据转化和数据清洗等任 务。
任务调度
可用于定时执行特定的数据库操作,如定时备份或 数据同步等。
触发器的使用情景
1
数据审计
当数据发生变化时,记录变更信息,用于追踪数据的修改。
2
数据约束
在数据修改前进行验证,保证数据的完整性和一致性。
3
自动计算
实现数据的自动计算,如自动更新汇总数据、计算利润等。
触发器常用于实现数据的自动更新、约束和 审计等功能,提高数据的一致性。
存储过程和触发器的区别
执行方式
存储过程需要显式调用,而触发器在特定事件发生时自动执行。
作用范围
存储过程作用于整个数据库,而触发器作用于特定的表。
执行顺序
触发器在数据修改之前或之后执行,而存储过程在需要时手动调用。
存储过程的使用情景
SQL课件存储过程和触发 器
存储过程和触发器是SQL中重要的概念。
存储过程
1 定义
2 使用情景
存储过程是在数据库中创建和存储的一段SQL 代码,可通过调用来执行特定的操作。
存储过程适用于需要反复执行的复杂SQL操作, 提高效率和可维护性。
触发器
1 定义
2 使用情景
触发器是一段与表相关联的SQL代码,它在特 定事件发生时自动执行。
存储过程和触发器的实例
1
实例1 :存储过程
Байду номын сангаас创建一个存储过程来自动生成订单号,
实例2 :触发器
2
并插入订单表中。
当学生成绩更新时,自动计算平均分并
更新到学生表中。
3
实例3 :存储过程
根据用户权限自动更新数据,保证数据
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
其中:
<procedure_option> ::= [ ENCRYPTION ] [ RECOMPILE ] [ <EXECUTE_AS_Clause> ]
※ 对于存储过程要注意下列几点: (1)用户定义的存储过程只能在当前数据库中创建(临时存储过程除外, 临时存储过程总是在系统数据库tempdb中创建)。 (2)成功执行CREATE PROCEDURE语句后,存储过程名称存储在 sysobjects系统表中,而CREATE PROCEDURE 语句的文本存储在 syscomments中。 (3)自动执行存储过程。SQL Server启动时可以自动执行一个或多个存储 过程。这些存储过程必须由系统管理员在master数据库中创建,并在sysadmin 固定服务器角色下作为后台过程执行。这些过程不能有任何输入参数。 (4)sql_statement的限制。如下语句必须使用对象的架构名对数据库对象 进行限定: CREATE TABLE、ALTER TABLE、DROP TABLE、TRUNCATE TABLE、 CREATE INDEX、DROP INDEX、UPDATE STATISTICS及DBCC语句。
主讲教师:孙丽娜
※7.1 存储过程 ※7.2 触发器 ※7.3 存储技术与 存储技术与.NET构架下 构架下CLR集成 存储技术与 构架下 集成
在SQL Server 2005中,使用T-SQL语句编写存储过程。存储过程可以接 受输入参数、返回表格或标量结果和消息,调用“数据定义语言(DDL)”和 “数据操作语言(DML)”语句,然后返回输出参数。使用存储过程的优点如 下: (1)存储过程在服务器端运行,执行速度快。 (2)存储过程执行一次后,就驻留在高速缓冲存储器,在以后的操作中, 只需从高速缓冲存储器中调用已编译好的二进制代码执行,提高了系统性能。 (3)使用存储过程可以完成所有数据库操作,并可通过编程方式控制对 数据库信息访问的权限,确保数据库的安全。 (4)自动完成需要预先执行的任务。存储过程可以在SQL Server启动时 自动执行,而不必在系统启动后再进行手工操作,大大方便了用户的使用,可 以自动完成一些需要预先执行的任务。
第一个存储过程:
CREATE PROCEDURE ado.do_insert AS INSERT INTO XSB VALUES('091201', '陶伟', 1, '1990-03-05', '软件工程',50, NULL);
第二个存储过程:
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
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 执行结果如下所示:
执行存储过程student_info1: EXECUTE student_info1 '王林', '计算机基础' 执行结果如下所示:
※ 以下命令的执行结果与上面相同: EXECUTE student_info1 @name='王林', @cname='计算机基础' 或者: DECLARE @proc char(20) SET @proc= 'student_info1' EXECUTE @proc @name='王林', @cname='计算机基础' (3)使用带OUPUT参数的存储过程。 【例7.3】 创建一个存储过程do_insert,作用是向XSB表中插入一行数据。 创建另外一个存储过程do_action,在其中调用第一个存储过程,并根据条件处 理该行数据,处理后输出相应的信息。
※ 如下语句不能出现在CREATE PROCEDURE定义中: SET PARSEONLY、SET SHOWPLAN_TEXT、SET SHOWPLAN_XML和 SET SHOWPLAN_ALL、CREATE DEFAULT、CREATE SCHEMA、CREATE FUNCTION、ALTER FUNCTION、CREATE PROCEDURE、ALTER PROCEDURE、CREATE TRIGGER、ALTER TRIGGER、CREATE VIEW、 ALTER VIEW、USE database_name。 (5)权限。CREATE PROCEDURE的权限默认授予sysadmin固定服务器 角色成员、db_owner 和 db_ddladmin 固定数据库角色成员。sysadmin 固定服 务器角色成员和 db_owner 固定数据库角色成员可以将CREATE PROCEDURE 权限转让给其他用户。
执行存储过程: EXECUTE st_info 或者: EXECUTE st_info '王%' /*传递给@name 的实参为'王%'*/
/*参数使用默认值*/
(5)使用OUTPUT游标参数的存储过程。OUTPUT游标参数用于返回存储 过程的局部游标。 【例7.5】 在 PXSCJ数据库的XSB表上声明并打开一个游标。
1.使用T-SQL命令创建存储过程 .使用 命令创建存储过程 创建存储过程的语句是CREATE PROCEDURE或CREATE PROC,两者同义。 语法格式:
CREATE { 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 assembly_name.class_name.method_name } [;]
※ 在 Microsoft SQL Server 2005 中有下列几种类型存储过程: (1)系统存储过程。系统存储过程是由SQL Server提供的存储过程,可以作 为命令执行。系统存储过程定义在系统数据库master中,其前缀是“sp_”,例如, 常用的显示系统对象信息的“sp_help”系统存储过程,为检索系统表的信息提供 了方便快捷的方法。 系统存储过程允许系统管理员执行修改系统表的数据库管理任务,可以在任 何一个数据库中执行。SQL Server 2005提供了很多的系统存储过程,通过执行系 统存储过程,可以实现一些比较复杂的操作,本书也介绍了其中一些系统存储过 程。要了解所有的系统存储过程,请参考SQL Server联机丛书。 (2)扩展存储过程。扩展存储过程是指在SQL Server2005环境之外,使用 编程语言(例如C++语言)创建的外部例程形成的动态链接库(DLL)。使用时, 先将DLL加载到SQL Server 2005系统中,并且按照使用系统存储过程的方法执行。 扩展存储过程在 SQL Server 实例地址空间中运行。但因为扩展存储过程不易撰写, 而且可能会引发安全性问题,所以微软可能会在未来的SQL Server中删除这个功 能,本书将不详细介绍扩展存储过程。
2.存储过程的执行 . 通过EXECUTE或EXEC命令可以执行一个已定义的存储过程,EXEC是 EXECUTE的简写。 语法格式: [ { EXEC | EXECUTE } ] { [ @return_status = ] { module_name [ ;number ] | @module_name_var } [ [ @parameter = ] { value | @variable [ OUTPUT ] | [ DEFAULT ] }] [ ,...n ] [ WITH RECOMPILE ] } [;] ※ 存储过程的执行要注意下列几点: (1)如果存储过程名的前缀为“sp_”,SQL Server会首先在master数据 库中寻找符合该名称的系统存储过程。如果没能找到合法的过程名,SQL Server才会寻找架构名称为dbo的存储过程。 (2)执行存储过程时,若语句是批处理中的第一个语句,则不一定要指定 EXECUTE关键字。
(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