数据库编程.ppt
数据库编程数据库编程7.27.1Transact-SQL语言语言-概述概述n n标准的标准的标准的标准的SQLSQL不支持流程控制,仅仅是一些简单不支持流程控制,仅仅是一些简单不支持流程控制,仅仅是一些简单不支持流程控制,仅仅是一些简单的语句,有时使用起来不方便。的语句,有时使用起来不方便。的语句,有时使用起来不方便。的语句,有时使用起来不方便。大型的关系型大型的关系型大型的关系型大型的关系型数据库系统都在标准数据库系统都在标准数据库系统都在标准数据库系统都在标准SQLSQL基础上,结合自身的基础上,结合自身的基础上,结合自身的基础上,结合自身的特点,推出了可以编程的、结构化的特点,推出了可以编程的、结构化的特点,推出了可以编程的、结构化的特点,推出了可以编程的、结构化的SQLSQL编程编程编程编程语言语言语言语言。例如,。例如,。例如,。例如,SQLServerSQLServer的的的的Transact-SQLTransact-SQL、OracleOracle的的的的PL/SQLPL/SQL等。等。等。等。n n在在在在Transact-SQLTransact-SQL中,标准的中,标准的中,标准的中,标准的SQLSQL语句可畅通语句可畅通语句可畅通语句可畅通无阻。无阻。无阻。无阻。Transact-SQLTransact-SQL最主要的用途是最主要的用途是最主要的用途是最主要的用途是设计服设计服设计服设计服务器端的能够在后台执行的程序块务器端的能够在后台执行的程序块务器端的能够在后台执行的程序块务器端的能够在后台执行的程序块,如存储过,如存储过,如存储过,如存储过程和触发器等。程和触发器等。程和触发器等。程和触发器等。7.37.1Transact-SQL语言语言-Transact-SQL程序程序的结构的结构1n n通过该程序可以看出,一个通过该程序可以看出,一个通过该程序可以看出,一个通过该程序可以看出,一个Transact-SQLTransact-SQL程序与一般程序与一般程序与一般程序与一般的高级语言的语法要素是一致的,的高级语言的语法要素是一致的,的高级语言的语法要素是一致的,的高级语言的语法要素是一致的,主要含有注释、变主要含有注释、变主要含有注释、变主要含有注释、变量与常量、各种运算符、函数与表达式、流程控制语量与常量、各种运算符、函数与表达式、流程控制语量与常量、各种运算符、函数与表达式、流程控制语量与常量、各种运算符、函数与表达式、流程控制语句等句等句等句等。n n下面通过一个实例来说明下面通过一个实例来说明下面通过一个实例来说明下面通过一个实例来说明Transact-SQLTransact-SQL程序的基本结程序的基本结程序的基本结程序的基本结构。构。构。构。n n例例例例7-17-1 打开学生选修课程管理数据库打开学生选修课程管理数据库打开学生选修课程管理数据库打开学生选修课程管理数据库scsc,并从数据表,并从数据表,并从数据表,并从数据表StudentStudent中计算中计算中计算中计算managementmanagement学生数,如果该院人数学生数,如果该院人数学生数,如果该院人数学生数,如果该院人数超过超过超过超过800800,则程序输出,则程序输出,则程序输出,则程序输出“这个学院的人数超过这个学院的人数超过这个学院的人数超过这个学院的人数超过800800”,否,否,否,否则输出则输出则输出则输出“这个学院的人数没有超过这个学院的人数没有超过这个学院的人数没有超过这个学院的人数没有超过800800”。7.4USESC/*USESC/*将学生选修课程管理数据库将学生选修课程管理数据库将学生选修课程管理数据库将学生选修课程管理数据库SCSC置为当前数据库置为当前数据库置为当前数据库置为当前数据库*/*/GOGODECLAREDECLAREStuNumINTStuNumINTSETSETStuNumStuNum=800=800IFIF(SELECTCOUNT(*)FROMTable_StudentWHERE(SELECTCOUNT(*)FROMTable_StudentWHERESchool=School=managementmanagement)StuNum)StuNum-输出结果输出结果输出结果输出结果PRINTPRINT 这个学院的人数超过这个学院的人数超过这个学院的人数超过这个学院的人数超过+CONVERT(VARCHAR(10),StuNum)+CONVERT(VARCHAR(10),StuNum)ELSEELSE-输出结果输出结果输出结果输出结果PRINTPRINT 这个学院的人数没有超过这个学院的人数没有超过这个学院的人数没有超过这个学院的人数没有超过+CONVERT(VARCHAR(10),+CONVERT(VARCHAR(10),StuNum)StuNum)-执行批处理执行批处理执行批处理执行批处理GOGO7.1Transact-SQL语言语言-Transact-SQL程序程序的结构的结构27.57.1Transact-SQL语言语言-Transact-SQL程序的批程序的批处理处理n nTransact-SQLTransact-SQL程序内两个程序内两个程序内两个程序内两个“GOGO”标记符之间的代码称标记符之间的代码称标记符之间的代码称标记符之间的代码称为一个为一个为一个为一个“批批批批”。SQLServerSQLServer对对对对Transact-SQLTransact-SQL程序的编程序的编程序的编程序的编译和执行是按照译和执行是按照译和执行是按照译和执行是按照“批批批批”为单位来进行的,称为批处理。为单位来进行的,称为批处理。为单位来进行的,称为批处理。为单位来进行的,称为批处理。n nGOGO语句本身并不是语句本身并不是语句本身并不是语句本身并不是Transact-SQLTransact-SQL语句的组成部分,语句的组成部分,语句的组成部分,语句的组成部分,它只是一个用于表示批处理结束的前端指令。它只是一个用于表示批处理结束的前端指令。它只是一个用于表示批处理结束的前端指令。它只是一个用于表示批处理结束的前端指令。“批批批批”中中中中的语句要么编译成功都执行,要么编译不成功都不执的语句要么编译成功都执行,要么编译不成功都不执的语句要么编译成功都执行,要么编译不成功都不执的语句要么编译成功都执行,要么编译不成功都不执行。行。行。行。n n一个一个一个一个Transact-SQLTransact-SQL程序中可以包含多个程序中可以包含多个程序中可以包含多个程序中可以包含多个“批批批批”。7.67.1Transact-SQL语言语言-变量变量1n n在在在在Transact-SQLTransact-SQL中,变量要声明后才可使用。中,变量要声明后才可使用。中,变量要声明后才可使用。中,变量要声明后才可使用。ECLAREECLARE命令用于声明一个或多个变量。命令用于声明一个或多个变量。命令用于声明一个或多个变量。命令用于声明一个或多个变量。DECLAREvariabledata_typeDECLAREvariabledata_type,nnn n在用在用在用在用DECLAREDECLARE命令声明之后,所有的变量都被赋予命令声明之后,所有的变量都被赋予命令声明之后,所有的变量都被赋予命令声明之后,所有的变量都被赋予初值初值初值初值NULLNULL。需要使用。需要使用。需要使用。需要使用SELECTSELECT或或或或SETSET命令来给变量命令来给变量命令来给变量命令来给变量赋值。赋值。赋值。赋值。SELECTSELECT局部变量局部变量局部变量局部变量=变量值变量值变量值变量值 或或或或SETSET局部变量局部变量局部变量局部变量=变变变变量值量值量值量值n n如果变量为字符型,那么,在如果变量为字符型,那么,在如果变量为字符型,那么,在如果变量为字符型,那么,在data_typedata_type表达式中应表达式中应表达式中应表达式中应指明其最大长度,否则系统认为其长度为指明其最大长度,否则系统认为其长度为指明其最大长度,否则系统认为其长度为指明其最大长度,否则系统认为其长度为1 1。7.77.1Transact-SQL语言语言-变量变量2n n例例例例7-27-2DECLAREDECLARE命令的用法。命令的用法。命令的用法。命令的用法。DECLARExCHAR,yCHAR(10)DECLARExCHAR,yCHAR(10)SELECTx=SELECTx=123123,y=,y=data_typedata_type PRINTxPRINTxPRINTyPRINTyn n则运行结果为:则运行结果为:则运行结果为:则运行结果为:1 1data_typedata_type7.87.1Transact-SQL语言语言-流程控制命令流程控制命令1n nTransact-SQLTransact-SQL使用的流程控制命令与常见的使用的流程控制命令与常见的使用的流程控制命令与常见的使用的流程控制命令与常见的程序设计语言类似,主要有以下几种控制命令。程序设计语言类似,主要有以下几种控制命令。程序设计语言类似,主要有以下几种控制命令。程序设计语言类似,主要有以下几种控制命令。n n1 1)BEGINBEGINENDENDBEGINBEGINENDEND的语法格式如下:的语法格式如下:的语法格式如下:的语法格式如下:BEGINBEGIN ENDENDn nBEGINBEGINENDEND用来设定一个程序块用来设定一个程序块用来设定一个程序块用来设定一个程序块,将在,将在,将在,将在BEGINBEGIN ENDEND内的所有程序视为一个单元执行。内的所有程序视为一个单元执行。内的所有程序视为一个单元执行。内的所有程序视为一个单元执行。7.9n n2 2)IFIFELSEELSEIFIFELSEELSE的语法格式如下:的语法格式如下:的语法格式如下:的语法格式如下:IFIF ELSEELSE n n其中,其中,其中,其中,可以是各种表达式的组合,但表达式可以是各种表达式的组合,但表达式可以是各种表达式的组合,但表达式可以是各种表达式的组合,但表达式的值必须是的值必须是的值必须是的值必须是逻辑值逻辑值逻辑值逻辑值TrueTrue或或或或FalseFalse。ELSEELSE子句是可选的,最子句是可选的,最子句是可选的,最子句是可选的,最简单的简单的简单的简单的IFIF语句没有语句没有语句没有语句没有ELSEELSE子句部分。子句部分。子句部分。子句部分。IFIFELSEELSE用来判断当用来判断当用来判断当用来判断当条件成立时执行条件成立时执行条件成立时执行条件成立时执行IFIF后的一段程序,条件不成立时执行后的一段程序,条件不成立时执行后的一段程序,条件不成立时执行后的一段程序,条件不成立时执行ELSEELSE后的一段程序。后的一段程序。后的一段程序。后的一段程序。7.1Transact-SQL语言语言-流程控制命令流程控制命令27.10n n3 3)IFNOTEXISTSIFNOTEXISTSIFNOTEXISTSIFNOTEXISTS的语法格式如下:的语法格式如下:的语法格式如下:的语法格式如下:IFNOTEXISTSIFNOTEXISTS(SELECTSELECT子查询)子查询)子查询)子查询)ELSEELSE n nIFEXISTSIFEXISTS语句用于检测数据是否存在,如果语句用于检测数据是否存在,如果语句用于检测数据是否存在,如果语句用于检测数据是否存在,如果EXISTSEXISTS后面后面后面后面的的的的“SELECTSELECT子查询子查询子查询子查询”的结果不为空,即检测到有数据记录的结果不为空,即检测到有数据记录的结果不为空,即检测到有数据记录的结果不为空,即检测到有数据记录存在时,就执行其后面的程序块,否则执行存在时,就执行其后面的程序块,否则执行存在时,就执行其后面的程序块,否则执行存在时,就执行其后面的程序块,否则执行ELSEELSE后面的程后面的程后面的程后面的程序块。序块。序块。序块。n n当采用当采用当采用当采用NOTNOT关键字时,则与上面的功能正好相反。关键字时,则与上面的功能正好相反。关键字时,则与上面的功能正好相反。关键字时,则与上面的功能正好相反。7.1Transact-SQL语言语言-流程控制命令流程控制命令37.11n n例例例例7-37-3 从从从从StudentStudent查询学号为查询学号为查询学号为查询学号为“s001s001”的同学的数据记录,的同学的数据记录,的同学的数据记录,的同学的数据记录,如果存在,则输出如果存在,则输出如果存在,则输出如果存在,则输出“存在学号为存在学号为存在学号为存在学号为s001s001的学生的学生的学生的学生”;否则输出;否则输出;否则输出;否则输出“不存在学号为不存在学号为不存在学号为不存在学号为s001s001的学生的学生的学生的学生”。USESC/*USESC/*将学生选修课程数据库置为当前数据库将学生选修课程数据库置为当前数据库将学生选修课程数据库置为当前数据库将学生选修课程数据库置为当前数据库*/*/GOGODECLAREmessageVARCHAR(255)/*DECLAREmessageVARCHAR(255)/*定义变量定义变量定义变量定义变量message*/message*/IFIFEXISTS(SELECT*FROMTable_StudentWHEREEXISTS(SELECT*FROMTable_StudentWHEREStudentID=StudentID=s001s001)SETmessage=SETmessage=存在学号为存在学号为存在学号为存在学号为s001s001的学生的学生的学生的学生 ELSEELSESETmessage=SETmessage=不存在学号为不存在学号为不存在学号为不存在学号为s001s001 PRINTmessagePRINTmessageGOGO7.1Transact-SQL语言语言-流程控制命令流程控制命令47.12n n4 4)CASECASECASECASE命令的语法格式如下:命令的语法格式如下:命令的语法格式如下:命令的语法格式如下:CASECASE WHENWHENTHENTHEN WHENWHENTHENTHEN ELSEELSEENDENDn n该语句的执行过程是:该语句的执行过程是:该语句的执行过程是:该语句的执行过程是:将将将将CASECASE后面表达式的值与各后面表达式的值与各后面表达式的值与各后面表达式的值与各WHENWHEN子子子子句中的表达式的值进行比较,如果二者相等,则返回句中的表达式的值进行比较,如果二者相等,则返回句中的表达式的值进行比较,如果二者相等,则返回句中的表达式的值进行比较,如果二者相等,则返回THENTHEN后后后后的表达式的值,然后跳出的表达式的值,然后跳出的表达式的值,然后跳出的表达式的值,然后跳出CASECASE语句,否则返回语句,否则返回语句,否则返回语句,否则返回ELSEELSE子句中子句中子句中子句中的表达式的值。的表达式的值。的表达式的值。的表达式的值。7.1Transact-SQL语言语言-流程控制命令流程控制命令57.13n n例例例例7-47-4 统计各个院的人数,如果人数超过统计各个院的人数,如果人数超过统计各个院的人数,如果人数超过统计各个院的人数,如果人数超过12001200人,则人,则人,则人,则输出输出输出输出“大院大院大院大院”;800800人到人到人到人到12001200人输出人输出人输出人输出“中等院系中等院系中等院系中等院系”;少于;少于;少于;少于800800人则输出人则输出人则输出人则输出“小院小院小院小院”。SELECTSchool,Type=CASESELECTSchool,Type=CASEWHENWHENCOUNT(*)1200COUNT(*)1200THENTHEN 大院大院大院大院 WHENWHENCOUNT(*)BETWEEN800AND1200COUNT(*)BETWEEN800AND1200THENTHEN 中等中等中等中等院系院系院系院系 WHENWHENCOUNT(*)800COUNT(*)800THENTHEN 小院小院小院小院 ENDENDFROMTable_StudentFROMTable_StudentGROUPBYSdepGROUPBYSdep7.1Transact-SQL语言语言-流程控制命令流程控制命令67.14n n5 5)WHILEWHILECONTINUECONTINUEBREAKBREAKWHILEWHILECONTINUECONTINUEBREAKBREAK的语法格式如下:的语法格式如下:的语法格式如下:的语法格式如下:WHILEWHILE BEGINBEGIN BREAKBREAKCONTINUECONTINUE 命令行或程序块命令行或程序块命令行或程序块命令行或程序块 ENDENDn nWHILEWHILE命令在设定的条件成立时会重复执行命令行或程序块。命令在设定的条件成立时会重复执行命令行或程序块。命令在设定的条件成立时会重复执行命令行或程序块。命令在设定的条件成立时会重复执行命令行或程序块。CONTINUECONTINUE命令可以让程序跳过命令可以让程序跳过命令可以让程序跳过命令可以让程序跳过CONTINUECONTINUE命令之后的语句,命令之后的语句,命令之后的语句,命令之后的语句,回到回到回到回到WHILEWHILE循环的第一行,继续进行下一次循环。循环的第一行,继续进行下一次循环。循环的第一行,继续进行下一次循环。循环的第一行,继续进行下一次循环。BREAKBREAK命令命令命令命令则让程序完全跳出循环,结束则让程序完全跳出循环,结束则让程序完全跳出循环,结束则让程序完全跳出循环,结束WHILEWHILE命令的执行。命令的执行。命令的执行。命令的执行。7.1Transact-SQL语言语言-流程控制命令流程控制命令77.15例例例例7-57-5 以下程序是计算以下程序是计算以下程序是计算以下程序是计算11001100之间所有能被之间所有能被之间所有能被之间所有能被3 3整除的整除的整除的整除的数的个数及总和。数的个数及总和。数的个数及总和。数的个数及总和。DECLAREsINT,iINT,numsINTDECLAREsINT,iINT,numsINTSETs=0SETs=0SETi=1SETi=1SETnums=0SETnums=0WHILEWHILE(i=100)(i=100)BEGINBEGIN IF(i%3=0)IF(i%3=0)BEGINBEGINSETs=s+iSETs=s+iSETnums=nums+1SETnums=nums+1ENDENDSETi=i+1SETi=i+1ENDENDPRINTsPRINTsPRINTnumsPRINTnums7.1Transact-SQL语言语言-流程控制命令流程控制命令87.167.2存储过程存储过程-概述概述1n n存储过程基本概念存储过程基本概念存储过程基本概念存储过程基本概念H H存储过程是一种把重复的任务操作封装起来的方法,存储过程是一种把重复的任务操作封装起来的方法,存储过程是一种把重复的任务操作封装起来的方法,存储过程是一种把重复的任务操作封装起来的方法,是一组是一组是一组是一组SQLSQL语句和可选控制流语句的预编译集合,语句和可选控制流语句的预编译集合,语句和可选控制流语句的预编译集合,语句和可选控制流语句的预编译集合,它们只需编译一次,以后即可多次执行它们只需编译一次,以后即可多次执行它们只需编译一次,以后即可多次执行它们只需编译一次,以后即可多次执行。H H因为因为因为因为SQLSQL语句不需要重新编译,所以执行存储过语句不需要重新编译,所以执行存储过语句不需要重新编译,所以执行存储过语句不需要重新编译,所以执行存储过程可以提高性能。程可以提高性能。程可以提高性能。程可以提高性能。存储过程可以接受参数,并可以存储过程可以接受参数,并可以存储过程可以接受参数,并可以存储过程可以接受参数,并可以将结果集、返回代码和输出参数返回将结果集、返回代码和输出参数返回将结果集、返回代码和输出参数返回将结果集、返回代码和输出参数返回给调用应用程给调用应用程给调用应用程给调用应用程序序序序。7.177.2存储过程存储过程-概述概述2n n存储过程的类型存储过程的类型存储过程的类型存储过程的类型H H系统存储过程系统存储过程系统存储过程系统存储过程H H本地存储过程本地存储过程本地存储过程本地存储过程H H临时存储过程临时存储过程临时存储过程临时存储过程H H远程存储过程远程存储过程远程存储过程远程存储过程H H扩展存储过程扩展存储过程扩展存储过程扩展存储过程7.187.2存储过程存储过程-创建存储过程创建存储过程1n nCREATEPROCEDURECREATEPROCEDURE的语法形式如下:的语法形式如下:的语法形式如下:的语法形式如下:CREATEPROCEDURECREATEPROCEDURE=默认值默认值默认值默认值OUTPUT,.nOUTPUT,.nASASSQLSQL语句语句语句语句.n.nn n存储过程包括过程首部和过程体。各个选项的含义如存储过程包括过程首部和过程体。各个选项的含义如存储过程包括过程首部和过程体。各个选项的含义如存储过程包括过程首部和过程体。各个选项的含义如下:下:下:下:H H :是要创建的存储过程的名字。是要创建的存储过程的名字。是要创建的存储过程的名字。是要创建的存储过程的名字。存储存储存储存储过程的命名必须符合命名规则过程的命名必须符合命名规则过程的命名必须符合命名规则过程的命名必须符合命名规则,在一个数据库中或,在一个数据库中或,在一个数据库中或,在一个数据库中或对其所有者而言,对其所有者而言,对其所有者而言,对其所有者而言,存储过程的名字必须惟一存储过程的名字必须惟一存储过程的名字必须惟一存储过程的名字必须惟一。7.19H H:是存储过程的参数。在:是存储过程的参数。在:是存储过程的参数。在:是存储过程的参数。在CREATEPROCEDURECREATEPROCEDURE语语语语句中,可以声明一个或多个参数。当调用该存储过程时,用户句中,可以声明一个或多个参数。当调用该存储过程时,用户句中,可以声明一个或多个参数。当调用该存储过程时,用户句中,可以声明一个或多个参数。当调用该存储过程时,用户必须给出所有的参数值,除非定义了参数的缺省值。必须给出所有的参数值,除非定义了参数的缺省值。必须给出所有的参数值,除非定义了参数的缺省值。必须给出所有的参数值,除非定义了参数的缺省值。H H :是参数的数据类型。:是参数的数据类型。:是参数的数据类型。:是参数的数据类型。H H默认值:是指参数的缺省值。如果定义了缺省值,那么即使不默认值:是指参数的缺省值。如果定义了缺省值,那么即使不默认值:是指参数的缺省值。如果定义了缺省值,那么即使不默认值:是指参数的缺省值。如果定义了缺省值,那么即使不给出参数值,则该存储过程仍能被调用。缺省值必须是常数,给出参数值,则该存储过程仍能被调用。缺省值必须是常数,给出参数值,则该存储过程仍能被调用。缺省值必须是常数,给出参数值,则该存储过程仍能被调用。缺省值必须是常数,或者是空值。或者是空值。或者是空值。或者是空值。H HOUTPUTOUTPUT:表明该参数是一个返回参数。用:表明该参数是一个返回参数。用:表明该参数是一个返回参数。用:表明该参数是一个返回参数。用OUTPUTOUTPUT参数可以参数可以参数可以参数可以向调用者返回信息。向调用者返回信息。向调用者返回信息。向调用者返回信息。H HASAS:指明该存储过程将要执行的动作。:指明该存储过程将要执行的动作。:指明该存储过程将要执行的动作。:指明该存储过程将要执行的动作。H HSQLSQL语句语句语句语句:是任何数量和类型的包含在存储过程中的:是任何数量和类型的包含在存储过程中的:是任何数量和类型的包含在存储过程中的:是任何数量和类型的包含在存储过程中的SQLSQL语句。语句。语句。语句。7.2存储过程存储过程-创建存储过程创建存储过程27.207.2存储过程存储过程-执行存储过程执行存储过程n n用用用用EXECUTEEXECUTE语句直接执行存储过程。语句直接执行存储过程。语句直接执行存储过程。语句直接执行存储过程。EXECUTEEXECUTE语句的语法形式如下:语句的语法形式如下:语句的语法形式如下:语句的语法形式如下:EXECUTEEXECUTE=value|=value|变量变量变量变量OUTPUT|DEFAULT|OUTPUT|DEFAULT|,nnH H各参数的含义和在各参数的含义和在各参数的含义和在各参数的含义和在CREATEPROCEDURECREATEPROCEDURE中含义相同。中含义相同。中含义相同。中含义相同。n n注意:注意:注意:注意:在执行有输出参数的存储过程时,执行语句中在执行有输出参数的存储过程时,执行语句中在执行有输出参数的存储过程时,执行语句中在执行有输出参数的存储过程时,执行语句中的变量名的后边要加上的变量名的后边要加上的变量名的后边要加上的变量名的后边要加上OUTPUTOUTPUT修饰符修饰符修饰符修饰符。在调用有输。在调用有输。在调用有输。在调用有输出参数的存储过程时,与输出参数对应的是一个变量,出参数的存储过程时,与输出参数对应的是一个变量,出参数的存储过程时,与输出参数对应的是一个变量,出参数的存储过程时,与输出参数对应的是一个变量,要先声明此变量,用来保存输出参数要先声明此变量,用来保存输出参数要先声明此变量,用来保存输出参数要先声明此变量,用来保存输出参数返回的结果。返回的结果。返回的结果。返回的结果。7.217.2存储过程存储过程-修改和删除存储过程修改和删除存储过程n n修改存储过程的语句与定义存储过程的语句基本一样,修改存储过程的语句与定义存储过程的语句基本一样,修改存储过程的语句与定义存储过程的语句基本一样,修改存储过程的语句与定义存储过程的语句基本一样,只要将只要将只要将只要将CREATEPROCEDURECREATEPROCEDURE改为改为改为改为ALTERALTERPROCEDUREPROCEDURE 即可。即可。即可。即可。n n用用用用DROPPROCEDUREDROPPROCEDURE语句删除存储过程。语句删除存储过程。语句删除存储过程。语句删除存储过程。n n删除存储过程的语法形式如下:删除存储过程的语法形式如下:删除存储过程的语法形式如下:删除存储过程的语法形式如下:DROPPROCEDUREDROPPROCEDURE,nn7.227.2存储过程存储过程-举例举例1n nCREATEPROCEDURECREATEPROCEDUREusp_Getallstudentsusp_GetallstudentsASASSELECT*FROMStudentSELECT*FROMStudent;n nEXECUTEEXECUTEusp_Getallstudentsusp_Getallstudents;7.23n nCREATEPROCEDURECREATEPROCEDUREusp_Getstudentusp_Getstudentnumbervarchar(40)numbervarchar(40)ASASSELECT*SELECT*FROMStudentFROMStudentWHERESid=numberWHERESid=number;n nEXECUTEEXECUTE usp_Getstudentusp_GetstudentS001S001;7.2存储过程存储过程-举例举例27.24n nCREATEPROCEDURECREATEPROCEDUREusp_GetstudentByNameusp_GetstudentByNamenamevarchar(40)=%namevarchar(40)=%ASASSELECT*FROMStudentSELECT*FROMStudentWHERESnameLIKEnameWHERESnameLIKEname;n nEXECUTEEXECUTEusp_GetstudentByNameusp_GetstudentByName;n nEXECUTEEXECUTEusp_GetstudentByNameusp_GetstudentByNameA%A%;n nEXECUTEEXECUTEusp_GetstudentByNameusp_GetstudentByNameAliceAlice;7.2存储过程存储过程-举例举例37.25n nCREATEPROCEDURECREATEPROCEDUREusp_GetAvgGradeByCidusp_GetAvgGradeByCidcidvarchar(40),cidvarchar(40),aveageintOUTaveageintOUTASASSETaveage=SETaveage=(SELECTAVG(Grade)FROMChoose(SELECTAVG(Grade)FROMChooseWHERECid=cid)WHERECid=cid);n nDECLAREDECLAREaveAgeOfCMintaveAgeOfCMintn nEXECUTEEXECUTEusp_GetAveAgeByDeptC001,usp_GetAveAgeByDeptC001,aveAgeOfCMOUTaveAgeOfCMOUTn nPRINTTheaveragegradeofC001isPRINTTheaveragegradeofC001is+str(aveAgeOfCM)+str(aveAgeOfCM)7.2存储过程存储过程-举例举例47.26n nALTERPROCEDUREALTERPROCEDUREusp_GetstudentByNamenamevarchar(40)ASSELECT*FROMStudentWHERESnameLIKEname;nDROPPROCEDUREusp_GetstudentByName;7.2存储过程存储过程-举例举例57.277.3触发器触发器-概述概述n n触发器基本概念触发器基本概念触发器基本概念触发器基本概念H触发器是一种触发器是一种触发器是一种触发器是一种特殊类型的存储过程特殊类型的存储过程特殊类型的存储过程特殊类型的存储过程。触发器触发器触发器触发器和表紧密相连和表紧密相连和表紧密相连和表紧密相连,用户的操作影响到触发器保,用户的操作影响到触发器保,用户的操作影响到触发器保,用户的操作影响到触发器保护的数据时,触发器就会自动发生。护的数据时,触发器就会自动发生。护的数据时,触发器就会自动发生。护的数据时,触发器就会自动发生。H H触发器有三种类型触发器有三种类型触发器有三种类型触发器有三种类型44INSERTINSERT触发器触发器触发器触发器44UPDATETUPDATET触发器触发器触发器触发器44DELETEDELETE触发器触发器触发器触发器7.287.3触发器触发器-创建触发器创建触发器1n n使用使用使用使用CREATETRIGGERCREATETRIGGER语句创建触发器,其语法形语句创建触发器,其语法形语句创建触发器,其语法形语句创建触发器,其语法形式如下:式如下:式如下:式如下:CREATETRIGGERCREATETRIGGER ONONFOR|AFTER|INSTEADOFFOR|AFTER|INSTEADOFINSERT|UPDATE|DELETEINSERT|UPDATE|DELETEASASSQLSQL语句语句语句语句 n n其中,各个选项的含义如下:其中,各个选项的含义如下:其中,各个选项的含义如下:其中,各个选项的含义如下:H H :触发器名称,必须符合:触发器名称,必须符合:触发器名称,必须符合:触发器名称,必须符合SQLServerSQLServer命名规则。命名规则。命名规则。命名规则。7.297.3触发器触发器-创建触发器创建触发器2H HFORFOR:指定触发器指定触发器指定触发器指定触发器只有在引发的只有在引发的只有在引发的只有在引发的SQLSQL语句中指定的语句中指定的语句中指定的语句中指定的操作都已经成功执行操作都已经成功执行操作都已经成功执行操作都已经成功执行,并且所有的约束检查也成功并且所有的约束检查也成功并且所有的约束检查也成功并且所有的约束检查也成功完成后,才执行此触发器完成后,才执行此触发器完成后,才执行此触发器完成后,才执行此触发器。这种触发器称为。这种触发器称为。这种触发器称为。这种触发器称为后触发后触发后触发后触发型型型型触发器。触发器。触发器。触发器。H HAFTERAFTER:作用和:作用和:作用和:作用和FORFOR一样。一样。一样。一样。H HINSTEADOFINSTEADOF:指定执行触发器而不是执行引发触指定执行触发器而不是执行引发触指定执行触发器而不是执行引发触指定执行触发器而不是执行引发触发器执行的发器执行的发器执行的发器执行的SQLSQL语句,从而替代触发语句的操作语句,从而替代触发语句的操作语句,从而替代触发语句的操作语句,从而替代触发语句的操作。这种触发器称为这种触发器称为这种触发器称为这种触发器称为前触发型前触发型前触发型前触发型触发器。触发器。触发器。触发器。H HINSERTINSERT,UPDATEUPDATE,DELETEDELETE:引发触发器执行:引发触发器执行:引发触发器执行:引发触发器执行的操作,可以同时指定多个操作,各个操作之间用的操作,可以同时指定多个操作,各个操作之间用的操作,可以同时指定多个操作,各个操作之间用的操作,可以同时指定多个操作,各个操作之间用逗号隔开。逗号隔开。逗号隔开。逗号隔开。7.307.3触发器触发器-创建后触型触发器创建后触型触发器n n例例例例7-67-6 更改了学生的学号更改了学生的学号更改了学生的学号更改了学生的学号,希望他的选课对应的学希望他的选课对应的学希望他的选课对应的学希望他的选课对应的学号修改号修改号修改号修改。CREATETRIGGERCREATETRIGGERTriStudentTriStudentOnStudentOnStudent-在在在在StudentStudent表中创建触发器表中创建触发器表中创建触发器表中创建触发器 FORUPDATEFORUPDATE-为什么事件触发为什么事件触发为什么事件触发为什么事件触发 ASAS-事件触发后所要做的事情事件触发后所要做的事情事件触发后所要做的事情事件触发后所要做的事情 ifUPDATE(Sid)ifUPDATE(Sid)BEGINBEGINUPDATEchooseUPDATEchooseSETSid=i.SidSETSid=i.SidFROMchoosesc,Deletedd,InsertediFROMchoosesc,Deletedd,Insertedi-Deleted-Deleted和和和和InsertedInserted临时表临时表临时表临时表 WHEREsc.Sid=d.SidWHEREsc.Sid=d.SidENDEND7.317.3触发器触发器-创建触发器创建触发器3n n理解触发器里面的两个临时的表:理解触发器里面的两个临时的表:理解触发器里面的两个临时的表:理解触发器里面的两个临时的表:Inserted,Inserted,DeletedDeleted,。注意。注意。注意。注意InsertedInserted与与与与DeletedDeleted分别表示触分别表示触分别表示触分别表示触发事件的表发事件的表发事件的表发事件的表“新的一条记录新的一条记录新