存储过程和触发器.docx
《存储过程和触发器.docx》由会员分享,可在线阅读,更多相关《存储过程和触发器.docx(17页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第7章 存储过程与触发器 7.1 存储过程 7.1.1 存储过程的类型 (1) 系统存储过程 系统存储过程是由系统提供的存储过程,作为命令执行各种操作。 (2) 本地存储过程 本地存储过程是指在用户数据库中创立的存储过程,这种存储过程完成特定数据库操作任务,其名称不能以sp_为前缀。(3) 临时存储过程临时存储过程属于本地存储过程。如果本地存储过程的名称前面有一个“#,该存储过程就称为局部临时存储过程,这种存储过程只能在一个用户会话中使用。(4) 远程存储过程 远程存储过程指从远程效劳器上调用的存储过程。(5) 扩展存储过程 在SQL Server环境之外执行的动态链接库称为扩展存储过程,其前
2、缀是sp_。使用时需要先加载到SQL Server系统中,并且按照使用存储过程的方法执行。7.1.2 用户存储过程的创立与执行 在用户存储过程的定义中不能使用以下对象创立语句:CREATE VIEWCREATE DEFAULT CREATE RULE CREATE PROCEDURE CREATE TRIGGER1通过SQL命令创立与执行存储过程如果要通过SQL命令定义一个存储过程查询XSCJ数据库中每个同学各门功课的成绩,然后调用该存储过程步骤如下:定义如下存储过程USE XSCJ GoCREATE PROCEDURE student_gradeAS FROM XS,XS_KC,KC Go使
3、用存储过程的优点: (1) 存储过程在效劳器端运行,执行速度快。 (2) 存储过程执行一次后,其执行规划就驻留在高速缓冲存储器,在以后的操作中,只需从高速缓冲存储器中调用已编译好的二进制代码执行,提高了系统性能。 (3) 确保数据库的平安。使用存储过程可以完成所有数据库操作,并可通过编程方式控制上述操作对数据库信息访问的权限。 (4) 自动完成需要预先执行的任务。存储过程可以在系统启动时自动执行,而不必在系统启动后再进展手工操作,大大方便了用户的使用,可以自动完成一些需要预先执行的任务。调用存储过程EXEC student_grade GO通过上例了解了存储过程的使用,下面介绍创立与执行存储过
4、程的语法格式。1) 创立存储过程语法格式:CREATE PROC EDURE procedure_name ; number /*定义过程名*/ parameter data_type /*定义参数的类型*/ VARYING = default OUTPUT /*定义参数的属性*/ ,.n1 WITH RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION /*定义存储过程的处理方式*/ FOR REPLICATION AS sql_statement .n2 /*执行的操作*/对于存储过程要注意以下几点:(1) 用户定义的存储过程只能在当前数据库中创立
5、临时过程除外,临时过程总是在 tempdb 中创立。(2) 成功执行 CREATE PROCEDURE语句后,过程名称存储在sysobjects 系统表中,而 CREATE PROCEDURE 语句的文本存储在 syscomments 中。(3) 自动执行存储过程 SQL Server 启动时可以自动执行一个或多个存储过程。这些存储过程必须由系统管理员在 master 数据库中创立,并在 sysadmin 固定效劳器角色下作为后台过程执行。 (4) sql_statement的限制 除了 SET SHOWPLAN_TEXT 与 SET SHOWPLAN_ALL外,其它SET 语句均可在存储过程
6、内使用。 (5) 权限.CREATE PROCEDURE的权限默认授予sysadmin固定效劳器角色成员,db_owner 与 db_ddladmin 固定数据库角色成员. 2存储过程的执行通过EXEC命令可以执行一个已定义的存储过程。语法格式: EXEC UTE return_status = procedure_name ;number | procedure_name_var parameter = value | variable OUTPUT | DEFAULT ,.n WITH RECOMPILE 存储过程的执行要注意以下几点:(1) 如果存储过程名的前三个字符为 sp_,SQL
7、Server 会在 Master 数据库中寻找该过程。如果没能找到合法的过程名,SQL Server 会寻找所有者名称为 dbo 的过程。(2) 参数可以通过 value 或 parameter_name = value 提供。 (3) 执行存储过程时,假设语句是批处理中的第一个语句,那么不一定要指定EXECUTE 关键字。3) 举例(1) 设计简单的存储过程【例7.1】从XSCJ数据库的三个表中查询,返回学生学号、姓名、课程名、成绩、学分。该存储过程不使用任何参数。USE XSCJ/*检查是否已存在同名的存储过程,假设有,删除。*/IF EXISTS (SELECT name FROM sy
8、sobjects WHERE name = student_info AND type = P) DROP PROCEDURE student_info GO /*创立存储过程*/CREATE PROCEDURE student_infoAS SELECT a.学号, 姓名, 课程名, 成绩, 学分 FROM XS a INNER JOIN XS_KC b ON a.学号 = b.学号 INNER JOIN KC t ON b.课程号= t.课程号 GO (2) 使用带参数的存储过程【例7.2】从XSCJ数据库的三个表中查询某人指定课程的成绩与学分。该存储过程承受与传递参数准确匹配的值。USE
9、 XSCJIF EXISTS (SELECT name FROM sysobjects WHERE name = student_info1 AND type = P) DROP PROCEDURE student_info1 GOCREATE PROCEDURE student_info1 name char (8),cname char(16) AS SELECT a.学号, 姓名, 课程名, 成绩, 学分 FROM XS a INNER JOIN XS_KC b ON a.学号 = b.学号 INNER JOIN KC t ON b.课程号= t.课程号 WHERE a.姓名=name
10、and t.课程名=cname GO (3) 使用带有通配符参数的存储过程【例7.3】从三个表的联接中返回指定学生的学号、姓名、所选课程名称及该课程的成绩。该存储过程在参数中使用了模式匹配,如果没有提供参数,那么使用预设的默认值。USE XSCJIF EXISTS (SELECT name FROM sysobjects WHERE name = st_info AND type = P) DROP PROCEDURE st_infoGO CREATE PROCEDURE st_infoname varchar(30) = 刘%AS FROM XS a INNER JOIN XS_KC b O
11、N a.学号 =b.学号 INNER JOIN KC c WHERE 姓名 LIKE name GO (4) 使用带OUTPUT参数的存储过程【例7.4】用于计算指定学生的总学分,存储过程中使用了一个输入参数与一个输出参数。USE XSCJ GO IF EXISTS(SELECT name FROM sysobjects WHERE name = totalcredit AND type = P)DROP PROCEDURE totalcreditGO USE XSCJGO CREATE PROCEDURE totalcredit name varchar(40), total int OUT
12、PUTAS SELECT total= SUM(学分)FROM XS,XS_KC,KC GO (5) 使用OUTPUT游标参数的存储过程OUTPUT 游标参数用于返回存储过程的局部游标。【例7.5】在 XSCJ数据库的XS表上声明并翻开一个游标。USE XSCJIF EXISTS (SELECT name FROM sysobjects WHERE name = st_cursor and type = P)DROP PROCEDURE st_cursor GOCREATE PROCEDURE st_cursor st_cursor CURSOR VARYING OUTPUTAS SET st
13、_cursor = CURSOR FORWARD_ONLY STATIC FOR SELECT * FROM XS OPEN st_cursor GO(6) 使用 WITH ENCRYPTION 选项WITH ENCRYPTION 子句对用户隐藏存储过程的文本。【例7.6】创立加密过程,使用 sp_helptext 系统存储过程获取关于加密过程的信息,然后尝试直接从 syscomments 表中获取关于该过程的信息。IF EXISTS (SELECT name FROM sysobjects WHERE name = encrypt_this AND type = P) DROP PROCED
14、URE encrypt_this GOUSE XSCJ GOCREATE PROCEDURE encrypt_this WITH ENCRYPTIONAS SELECT * FROM XS GO (7) 创立用户定义的系统存储过程【例7.7】创立一个过程,显示表名以 xs 开头的所有表及其对应的索引。如果没有指定参数,该过程将返回表名以 kc 开头的所有表及对应的索引。IF EXISTS (SELECT name FROM sysobjectsWHERE name = sp_showtable AND type = P) DROP PROCEDURE sp_showtable GOUSE ma
15、ster GOCREATE PROCEDURE sp_showtable TABLE varchar(30) = kc%AS SELECT tab.name AS TABLE_NAME, inx.name AS INDEX_NAME, indid AS INDEX_IDFROM sysindexes inx INNER JOIN sysobjects tab ON tab.id = inx.id WHERE tab.name LIKE TABLE GO USE XSCJEXEC sp_showtable xs% GO7.1.3 用户存储过程的编辑修改 语法格式:ALTER PROC EDURE
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 存储 过程 触发器
限制150内