数据库行为特征设计-SQL程序设计.ppt
《数据库行为特征设计-SQL程序设计.ppt》由会员分享,可在线阅读,更多相关《数据库行为特征设计-SQL程序设计.ppt(81页珍藏版)》请在三一办公上搜索。
1、7.1SQL程序基础7.2函数和表达式流程控制语句7.3存储过程触发器7.4触发器游标7.5临时表和表变量7.6游标7.7事务,第八章 数据库行为特征设计SQL程序设计,7.1 SQL程序基础,7.1.1批处理:批处理是一组Transact-SQL 语句,其中可以包括变量的流程控制语句由客户端应用程序一次性地发送到数据库服务器SQL Server 的数据库服务器将批处理语句编译成一个可执行单元,此单元称为执行计划,执行计划中的语句被逐条执行。批处理中语法错误:将使执行计划无法编译,所有语句都不执行。批处理中的逻辑(运行)错误(如违反完整性规则):该语句将不能正常运行,该语句以前语句正常执行,该
2、语句以后语句大多数情况下不能正常运行,少数情况下仍能正常运行。,7.1.2变量的声明和使用,变量分局部变量和全局变量局部变量是可以保存指定类型的单个数据值的对象,其名称前必须标以“”。全局变量是由系统提供且预先声明的变量,在引用它的时候在名称前必须标以“”。,一)局部变量,局部变量的生存期从声明它的地方开始,直到声明它的批处理、存储过程或函数结束局部变量的定义:DECLARE,.n 例:DECLARE num INTEGER局部变量赋值:SET 变量名=或SELECT=表达式FROM,.n WHERE 返回局部变量值:PRINT 或SELECT,四)全局变量,全局变量是由系统提供且预先声明的变
3、量,系统根据当前的运行环境和状况对其进行赋值。用户程序不能改变其值,但它可以被任何批处理程序、存储过程和函数读取。SQL Server提供了30多个全局变量,下面列出了一些常用的全局变量。,全局变量,ERROR:返回最后执行的 SQL 语句的错误代码。FETCH_STATUS:读取游标状态,返回最近的FETCH 语句的执行状态IDENTITY:返回最后插入的标识值。CREATE TABLE Teacher(TeacherId INT IDENTITY(1000,1)PRIMARY KEY,TeacherName VARCHAR(20),7.1.3流程控制语句一)分支语句IF,IF BEGIN.
4、n END ELSE BEGIN.n END/如果IF和ELSE后只有一个语句,可以省略BEGIN和END,二)循环语句,循环语句的一般格式:WHILE BEGIN语句.nBREAKCONTINUE 语句.nEND BREAK语句使循环结束 CONTINUE语句进入下一循环,三)RETURN语句,RETURN expression结束程序,RETURN以后的程序将不被执行。若包含表达式,通常在函数中使用,表示该函数返回该表达式值,若在存储过程中使用,表达式值必须为整型。,例:实现对某个结点在树结构中所在层数的计算,DECLARE Id INT,Lev INTSET Id=8-计算id=8结点的
5、层数SET Lev=0WHILE 1=1BEGIN SET Id=(SELECT PId FROM GoodsClass1 WHERE Id=Id)IF Id IS NULL BREAK ELSE SET Lev=Lev+1ENDPRINT Lev,7.2 函数和表达式,函数是存储在数据库中可供其他程序调用的SQL程序,其基本特征是具有返回值根据返回类型的不同,SQL Server提供了返回单值的标量函数和返回一个表的表值函数两种类型的函数。函数创建后就永久存在于数据库中,直到使用删除语句删除它。SQL Server提供了大量的内置函数即标准函数供用户调用。表达式是符号与运算符的组合,SQL
6、Server对其求值以获得单个数据值。,7.2.1表达式和标准函数,一)各种类型的数据运算及数据类型的隐形转换1)数值和字符串混合运算SELECT 100+123:输出为2232)日期和数值混合运算SELECT GETDATE()+365:输出为明年与今日同月同日的日期3)字符串转换为日期UPDATE Student SET Birthday=-1990-4-174)日期转换成字符串SELECT LEFT(GETDATE(),2),结果为“04”,即当前的月份字符串,二)表达式和空值,当表达式中存在空值,则表达式值为空值。当条件表达式中出现空值,则条件表达式值为FALSE,如下列条件判断均为F
7、ALSE:IF(X=NULL)IF(3NULL)IF(NULL=NULL)在需要判断某表达式是否为空时,必须使用IS及IS NOT:IF(X IS NULL)IF(X IS NOT NULL),三)CASE表达式,1)格式一CASE 表达式0WHEN 表达式i THEN 结果表达式i.n ELSE 表达式n+1END例:SELECT StdId,StdName,CASE StdSexWHEN 1 THEN 男WHEN 0 THEN 女ELSE 未知ENDFROM Student,2)格式二CASEWHEN 逻辑表达式iTHEN 结果表达式i.nELSE 表达式n+1END例:SELECT a.
8、StdId,a.StdName,b.EleName,Grade=CASE WHEN c.Grade=90 THEN 优WHEN c.Grade=80 THEN 良WHEN c.Grade=70 THEN 中WHEN c.Grade=60 THEN 及格ELSE 不及格ENDFROM Student a,Elective b,Student_Elective cWHERE a.StdId=c.StdId AND b.EleId=c.EleId,7.2.1.2标准函数,SQL Server提供了大量的各类标准函数SELECT语句中通过使用函数和函数的嵌套,可使我们用一个SELECT语句实现比较复杂
9、的查询需求,一)常用函数介绍,常用日期类型函数:GETDATE()YEAR(date)DATEDIFF(datepart,startdate,enddate)DATEADD(datepart,number,date)DATEPART(datepart,date),常用字符类型的函数LTRIM/RTRIM(character_expresion)REPLICATE(character_expression,integer_expression)LEN(string_expression)SUBSTRING(expression,start,length)CHARINDEX(expression1
10、,expression2,start_location)REPLACE(string_expression1,string_expression2,string_expression3)LEFT(character_expression,integer_expression),类型转换和其他函数 CONVERT(data_type(length),expression,style)STR(float_expr,length,decimal)ISNULL(check_expression,replacement_value)POWER(numeric_expression,y),二)函数的应用实
11、例,把Supplier中供应商名称SuppName中包含“南市区”的全部改成“黄埔区”:UPDATE Supplier SET SuppName=REPLACE(SuppName,南市区,黄埔区)如果供应商名称前必须冠以所在省市,并以“-”与后面的供应商名分割,要求分列查询供应商所在省市和供应商名 SELECT SUBSTRING(SuppName,1,CHARINDEX(-,SuppName)-1),SUBSTRING(SuppName,CHARINDEX(-,SuppName)+1,LEN(SuppName)-CHARINDEX(-,SuppName)FROM Supplier,输出学生的
12、学号、姓名以及年龄,年龄的计算方法为:如当前日期的“月日”小于出生日期的“月日”,年龄当前年份出生年份1如当前日期的“月日”大于等于出生日期的“月日”,年龄当前年份出生年份SELECT StdId,StdName,YEAR(GETDATE()-YEAR(Birthday)-CASEWHEN LEFT(CONVERT(CHAR(10),Birthday,101),5)LEFT(CONVERT(CHAR(10),GETDATE(),101),5)THEN 1ELSE 0ENDFROM Student,查询“09”开头的下一个可用的学号,假设学号总长为5位字符,下一个可用编号就是“09”开头的学号中
13、后三位的最大编号1后的编号 SELECT 09+RIGHT(REPLICATE(0,2)+LTRIM(STR(MAX(RIGHT(StdId,3)+1,3),3)FROM Student WHERE StdId LIKE 09%,7.2.2自定义函数标量函数,创建标量函数的语句为:CREATE FUNCTION 函数名(参数名 参数类型=默认值,.n)RETURNS 返回类型WITH ASBEGIN 函数体(其中必须包含RETURN语句)END函数一旦创建,就永久存在,直到使用DROP FUNCTION删除它,函数选项:ENCRYPTION 和SCHEMABINDING,ENCRYPTION:
14、加密该函数体中的内容,使用任何工具都无法看到函数体程序。SCHEMABINDING:将函数绑定(Binding)到它所引用的数据库对象,即不能更改或除去该函数所引用的数据库对象,避免由于删除或修改了函数所引用的数据对象,而使函数无法正常运行。,例:供应商名称格式化,要求:Supplier表中供应商名为英文,要求对其格式化,每个单词的第一字母大写,若两个单词之间出现多于一个空格,则去除多余的空格。创建一个函数,该函数参数为字符串,返回的是根据要求格式化后的字符串假设函数名为FormatStr,则对供应商名的格式化语句为:UPDATE Supplier Set SuppName=dbo.Forma
15、tStr(SuppName)以sa登录数据库,创建所有对象包括函数都属于一个特定的数据库用户dbo(DataBase Owner),dbo是SQL Server为每个数据库预置的数据库用户,在引用函数的时候必须在函数名前加“dbo.”,7.2.3表值函数,表值函数可以返回一个表,即其返回类型是table类型表值函数分为单语句表值函数和多语句表值函数 如果一个查询比较复杂,通常我们可以把它定义成一个视图,如果查询包含了参数,一般情况下我们仍能使用视图实现,但可能会使视图对应的查询语句变得更为复杂,这个时候就可以考虑使用单语句表值函数。如果一个查询根本无法用一个SELECT语句完成时,就可以考虑使
16、用多语句表值函数,即用一段程序来获得查询数据,7.2.3.1 单语句表值函数,创建单语句表值函数的语句为:CREATE FUNCTION 函数名(参数名 参数类型=默认值,.n)RETURNS TABLE WITH ASRETURN 查询语句该函数将返回执行“查询语句”后得到的结果集,可以使用下列语句获得结果:SELECT*FROM 函数名(参数表),例:查询某个学生选修各门课的名称和成绩,建立单语句表值函数CREATE FUNCTION AllGrade(StdId char(6)RETURNS table ASRETURN SELECT c.EleName,b.GradeFROM Stud
17、ent a LEFT JOIN Student_Elective b ON a.StdId=b.StdIdLEFT JOIN Elective c ON b.EleId=c.EleIdWHERE a.StdId=StdId使用下列语句获得结果:SELECT*FROM AllGrade(该学生学号),用表值函数实现先选择后进行外连接的查询:查询所有学生选修“ele002”课程的情况,结果中包括学号和课程名,对没有选修该课程的学生,课程名为NULL,定义表值函数:CREATE FUNCTION Student_Some_Elective(EleId CHAR(6)RETURNS TABLEASRE
18、TURN SELECT*FROM Student_Elective WHERE EleId=EleId使用查询语句:SELECT a.StdName,c.EleName FROM Student a LEFT JOIN Student_Some_Elective(ele002)b on a.StdId=b.StdIdLEFT JOIN Elective c ON b.EleId=c.EleId,7.2.3.2多语句表值函数,创建多语句表值函数的语句为:CREATE FUNCTION 函数名(参数名 参数类型=默认值,.n)RETURNS 表变量名 TABLE WITH ASBEGIN 函数体E
19、ND函数体内可包含一个由多个语句组成的程序,该程序完成获取最终需要的数据,并把它插入或更新到“表变量名”表示的表中,在执行RETURN时,该表数据将被作为函数的结果返回。,例:查询某个班学生选修的各门课的及格和不及格人数,查询结果包括:课程号、课程名、及格人数和不及格人数CREATE FUNCTION ElectiveGradeSummary(ClassId CHAR(6)RETURNS PassNumSummaryTABLE(ElectiveId CHAR(6),EleName VARCHAR(20),PassNum INT,NotPassNum INT)ASBEGIN-插入班级学生选修的课
20、程INSERT into PassNumSummary(ElectiveId,EleName)SELECT DISTINCT a.EleId,b.EleName FROM Student_Elective a JOIN Elective b ON a.EleId=b.EleIdWHERE StdId in(SELECT StdId FROM Student WHERE ClassId=ClassId)-计算及格人数UPDATE PassNumSummary SET PassNum=(SELECT count(*)FROM Student_Elective WHERE EleId=Electiv
21、eId AND Grade=60 AND StdId IN(SELECT StdId FROM Student WHERE ClassId=ClassId)-计算不及格人数UPDATE PassNumSummary SET NotPassNum=(SELECT count(*)FROM Student_Elective WHERE EleId=ElectiveId AND Grade60 AND StdId IN(SELECT StdId FROM Student WHERE ClassId=ClassId)RETURN END查询班号为“09001”班级中各门选修课的及格和不及格人数的查询语
22、句为:SELECT*FROM ElectiveGradeSummary(09001),7.3 存储过程,若一个算法最终返回一个标量,可以使用标量函数若一个算法要返回一个表,可直接使用查询语句,使用视图或使用表值函数,若一个算法要返回多于一个标量或不需要返回任何值,则可考虑使用存储过程。,存储过程,存储过程是被存储在数据库中的可以接受和返回用户提供参数的SQL程序存储过程在创建时被编译和优化,创建后可被其他存储过程、函数调用。客户端的应用程序也可通过向数据库服务器提交EXECUTE命令调用存储过程。存储过程被第一次调用后,将驻留在内存中,所以执行效率高,存储过程运行于数据库服务器端,其数据来源及
23、输出结果通常存储在一台计算机上,与在客户机上实现相同算法相比,可以大大减少了客户机和服务器之间的通信量。,7.3.1存储过程的创建和调用,一)创建存储过程命令格式为:CREATE PROCEDURE 存储过程名参数名 参数类型=默认值 OUTPUT,.nWITH RECOMPLE|ENCRIPTION|RECOMPILE,ENCRIPTION AS SQL语句,.nOUTPUT:该参数在存储过程退出后,其值将返回至调用程序,在调用存储过程时也要使用关键字OUTPUT。RECOMPLE:创建的存储过程在每次运行时都将被重新编译。,二)调用存储过程,命令格式 EXEC UTE 返回状态=存储过程名
24、 参数=值|变量 OUTPUT|DEFAULT,.n WITH RECOMPILE SQL Server存储过程调用时,参数必须为常数或变量,但不能是表达式或函数,假设PROC是一个存储过程,以下调用都是错误的:EXECUTE PROC a+1EXECUTE PROC ROUND(a)WITH RECOMPILE的作用是在运行存储过程前对存储过程重新编译,若创建存储过程时已包含该选项,则此处不必再打开此选项。,三)在查询分析器中调试存储过程,SQL Server的查询分析提供了对存储过程的运行跟踪机制。在左侧的对象浏览器窗口中,右击要调试的储存过程,在弹出的快捷菜单中选择“调试”命令,该存储过
25、程的源程序将出现在窗口中,并出现一个用于跟踪调试的工具栏。包含了设置断点、单步跟踪、运行到光标处等几乎所有的常用的跟踪调试功能,在程序下方列出相关的全局和局部变量的当前取值。,四)删除和修改存储过程,删除存储过程的语句格式:DROP PROCEDURE 过程名,.n修改存储过程的语句格式:ALTER PROCEDURE.(余下部分格式同CREATE PROCEDURE)使用ALTER PROCEDURE将覆盖原存在于数据库中同名的存储过程。,例:编写一个存储过程,参数为班号和课程号,通过存储过程的输出(OUTPUT)参数获得指定班级和课程的及格和不及格人数,存储过程:CREATE PROCED
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据库 行为 特征 设计 SQL 程序设计
链接地址:https://www.31ppt.com/p-6578673.html