第8章(2)DataBase存储过程
数据库的结构

数据库的结构数据库的结构一、数据库结构概述数据库DataBase,DB是指在计算机的存储设备上合理存放的相关联的有结构的数据集合。
一个数据库含有种成分,包括记录、字段)、索引、查询、过滤器、视图、存储过程等。
VisualBasic中使用的数据库是关系型数据库RelationalDatabase)。
一个数据库由一个或一组数据表组成。
每个数据库都以文件的形式存放在磁盘上,即对应于一个物理文件。
不同的数据库,与物理文件对应的方式也不一样。
对于dBASEFoxPro和Paradox格式的数据库来说,一个数据表就是一个单独的数据库文件而对于MicrosoftAccessBtrieve格式的数据库来说,一个数据库文件可以含有多个数据表。
ataTable),简称表,由一组数据记录组成数据库中的数据是以表为单位进行组织的。
一个表是一组相关的按行排列的数据每个表中都含有相同类型的信息。
表实际上是一个二维表格例如,一个班所有学生的考试成绩可以存放在一个表中,表中的每一行对应一个学生,这一行包括学生的学号,姓名及各门课程的成绩。
表中的每一行称为一个记录它由若干个字段组成。
也称域。
表中的每一列称为一个字段。
每个字段都有相应的描述信息,如数据类型、数据宽度等。
为了提高访问数据库的效率可以对数据库使用索引。
当数据库较大时,查找指定的记录使用索引和不使用索引的效率有很大差别。
索引实际上是一种特殊类型的表,其中含有关键字段的值由用户定义和指向实际记录位置的指针这些值和指针按照特定的顺序也由用户定义存储,从而可以以较快的速度查找到所需要的数据记录。
一条SQLStructuredQueryLanguage,结构化查询语言命令,用来从一个或多个表中获取一组指定的记录,或者对某个表执行指定的操作。
当从数据库中读取数据时,往往希望读出的数据符合某些条件,并且能按某个字段排序。
使用SQL,可以使这一操作容易实现而且更加有效。
SQL是非过程化语言有人称为第四代语言,当用它查找指定的记录时,只需指出做什么,不必说明如何做。
数据库原理与应用 习题及解答

《数据库原理与应用》习题及解答管理学院管理科学与工程系2016.2第1章数据库基本概念1.什么是数据库系统?它有什么特点?答: 数据库系统(database system ,DBS)是指实现有组织地、动态地存储大量关联数据、方便用户访问的计算机硬件、软件和数据资源组成的系统。
通常由数据库、数据库管理系统、应用系统程序和数据库管理员及用户等几部分组成。
数据库系统有以下特点:(1) 数据结构化(2) 数据共享(3) 数据独立性(4) 可控冗余度2.什么是数据库管理系统?它的主要功能有哪些?答:数据库管理系统(DBMS)是指位于用户与操作系统之间的一层数据管理软件,它为用户或应用程序提供访问数据库的方法,包括数据库的建立、查询、更新及各种数据控制,是数据库系统的核心软件。
它的主要功能:(1)数据定义功能(2)数据操纵功能(3)数据的完整性检查功能(4)数据库的安全保护功能(5)数据库系统的故障恢复功能(6)在网络化环境下访问数据库的功能3.某高校中有若干个系部,每个系部都有若干个年级和教研室,每个教研室有若干个教师,其中有的教授和副教授每人带若干个研究生,每个年级有若干个学生,每个学生选修若干课程,每门课可有若干个学生选修。
试用E-R图描述此学校的关系概念模型。
答:4.定义并解释概念模型中以下术语:实体,属性,码,E-R图答: 实体:每一类数据对象的个体称为“实体”。
属性:每个实体集涉及的信息项目称为“属性”。
码:能够唯一标识其对应实体的属性或属性组合称为“码”。
E-R图:即实体-联系图,用来表示数据模型,直接从现实世界中抽象出实体类型及实体间联系。
5.SQL包含哪些组件,其功能各是什么?答:1. SQL Server 数据库引擎(MSSQLServer service)用来处理所有发自SQL Server客户端应用程序的T-SQL语句的组件,SQLServer service 协调和安排这些语句的执行,并向客户机反馈结果。
数据库第8章习题参考答案

第8章习题参考答案2.求程序的运行结果(1)Public Sub 习题8_2_1()Dim i As IntegerDebug.Print Tab(10); "*"For i = 1 To 5Debug.Print Tab(10 - i); "*"; Spc(i - 1); "*"; Spc(i - 1); "*"Next iFor i = 4 To 1 Step -1Debug.Print Tab(10 - i); "*"; Spc(i - 1); "*"; Spc(i - 1); "*"Next iDebug.Print Tab(10); "*"End Subrun:***** * ** * ** * ** * ** * ** * ** * *****(2)Public Sub 习题4_2_2()Dim x, y, i As Doublex = 0: y = 0For i = 1 To 8If i Mod 2 <> 0 Thenx = x - iElsey = y + iEnd IfNextDebug.Print "i="; iDebug.Print "x="; xDebug.Print "y="; yEnd Subrun:x=-16y= 20(3)Public Sub习题4_2_3()Dim m, s, k As Doublem = 28s = 0k = 1Do While k <= Int(m / 2)If Int(m / k) = m / k ThenDebug.Print ks = s + kEnd Ifk = k + 1LoopDebug.Print "s="; sEnd Subrun:124714s= 28(4)Public Sub 习题8_2_4()Dim n, a1, a2, a3, i As Doublen = Val(InputBox("请输入n,要求n>=3"))If n <= 2 ThenExit SubEnd Ifa1 = 1a2 = 1Debug.Print a1; a2For i = 2 To n - 1a3 = a1 + a2a1 = a2a2 = a3Debug.Print a3NextEnd Sub1 12353.改错题(1)Public Sub 改错8_3_1()Dim i, n, s As Doublen = Val(InputBox("请输入n"))i = 2: s = 1Do While i <= ns = s + ii = i + 1LoopDebug.Print "S="; sEnd Sub(2)Public Sub 改错8_3_2_求分式多项和()Dim nm, n, k ,p As integerDim y As Doublenm = Val(InputBox("请输入计算公式1后面的项目数目个数")) n = 1: p = 1: y = 1Do While n <= nmk = 2 * n + 1p = p * (k - 1) * ky = y + ((-1) ^ n) / pn = n + 1LoopDebug.Print "y="; yEnd Sub4.编程题(1)用if……else语句编程Public Sub分段函数1()Dim x, y, z As Doublex = Val(InputBox("请输入x的值:"))y = Val(InputBox("请输入y的值:"))If x > y And y <> 0 Thenz = x / yElseIf x = y Thenz = x * y * Sgn(y)Elsez = x + yEnd IfDebug.Print "x="; xDebug.Print "y="; yDebug.Print "z="; zEnd Sub(1)用select case语句结构编程Public Sub分段函数2()Dim x, y, z, a As Doublex = Val(InputBox("请输入x"))y = Val(InputBox("请输入y"))a = y - xSelect Case aCase Is > 0z = x + yDebug.Print zCase 0z = x * y * Sgn(y)Debug.Print zCase ElseIf y <> 0 Thenz = x / yDebug.Print zElseDebug.Print "z没有值"End IfEnd SelectEnd Sub(2)Public Sub 求解一元二次方程()Dim a, b, c As IntegerDim d, x1, x2, x3, x4 As Doublea = Val(InputBox("请输入a的整型数:"))b = Val(InputBox("请输入b的整型数:"))c = Val(InputBox("请输入c的整型数:"))d = b * b - 4 * a * cIf d > 0 Thenx1 = (-b + Sqr(d)) / (2 * a)x2 = (-b - Sqr(d)) / (2 * a)Debug.Print "x1="; x1, "x2="; x2Else if d=0 thenx3 = -b / (2 * a)x4 = -b/ (2 * a)Debug.Print "x3=";x3Debug.Print "x4=";x4ElseDebug.Print "方程没有实数解"End IfEnd Sub(3--1)用无条件转向语句GOTO编程Public Sub 数字与星期的转换1()Dim num As Integer10 num = Val(InputBox("请输入整数值:")) If num = 0 ThenDebug.Print "这是星期日"ElseIf num = 1 ThenDebug.Print "这是星期一"ElseIf num = 2 ThenDebug.Print "这是星期二"ElseIf num = 3 ThenDebug.Print "这是星期三"ElseIf num = 4 ThenDebug.Print "这是星期四"ElseIf num = 5 ThenDebug.Print "这是星期五"ElseIf num = 6 ThenDebug.Print "这是星期六"ElseIf num = -1 ThenDebug.Print "程序运行结束"EndElseDebug.Print "输入数据错误!"GoTo 10End IfEnd Sub(3--2)Public Sub数字与星期的转换2 ()Dim x As IntegerDo While Truex = Val(InputBox("请输入数字"))If x = 0 ThenDebug.Print "这是星期日"Exit DoElseIf x >= 1 And x <= 6 ThenDebug.Print "这是星期" + Str(x)Exit DoElseIf x = -1 ThenExit DoElseMsgBox ("输入数据错误!")End IfLoopEnd Sub(4)Public Sub 行李重量计费()Dim an, cn, weight, s_w, distance, fee As Doublean = Val(InputBox("请输入成年人数量"))cn = Val(InputBox("请输入未成年人数量"))weight = Val(InputBox("请输入行李重量"))distance = Val(InputBox("请输入距离"))s_w = weight - 20 * an - 10 * cnIf s_w <= 0 Thenfee = 0ElseIf distance / 100 = Int(distance / 100) Thenfee = 0.2 * s_w * (distance / 100)Elsefee = 0.2 * s_w * (Int(distance / 100) + 1) End IfEnd IfDebug.Print feeEnd Sub(5)Public Sub 求自然数的多项式和()Dim n, s As Integers = 0For n = 1 To 10s = s + (s + n)NextDebug.Print "S=1+(1+2)+(1+2+3)+...+1+2+3+...+10)="; s End SubRun:S=1+(1+2)+(1+2+3)+...+1+2+3+...+10)= 2036Public Sub 求多项自然数阶乘的和()Dim s, t As SingleDim n As Integert = 1s = 0For n = 1 To 20t = t * ns = s + tNextDebug.Print "1!+2!+3!+...+20!="; sEnd SubRun:1!+2!+3!+...+20!= 2.561327E+18(6)Public Sub 既能被3整除又能被5整除正整数个数() Dim i, x As Integerx = 0For i =100 To 200If i / 3 = Int(i / 3) And i / 5 = Int(i / 5) ThenDebug.Print ix = x + 1End IfNextDebug.Print "x="; xEnd SubRun:120135150165180195x= 7(7)Public Sub 输出直角三角形图案1()Dim i, j As IntegerFor i = 1 To 9Debug.PrintNextFor i = 1 To 4Debug.Print Tab(20); "*";For j = 1 To (2 * i - 2)Debug.Print "*";NextDebug.PrintNextEnd SubRun:****************Public Sub 输出直角三角形图案2() Dim i, j As IntegerFor i = 1 To 9Debug.PrintNextDebug.Print Tab(20); "*";For i = 1 To 4Debug.Print Tab(19 - i); "*";For j = 1 To (i + 1)Debug.Print "*";NextDebug.PrintNextEnd SubRun:*******************Public Sub 输出平行四边形图案() Dim i, j As IntegerFor i = 1 To 9Debug.PrintNextFor i = 1 To 5Debug.Print Tab(21 - i);For j = 1 To 6Debug.Print "*";NextDebug.PrintNextEnd SubRun:******************************(8)Public Sub 求选手获得的平均分()Dim score(1 To 11), minno, maxno, sum, aver As Single Dim i As Integerminno = 1maxno = 1sum = 0For i = 1 To 10score(i) = Val(InputBox("请输入选手的成绩值:")) Debug.Print score(i)NextFor i = 2 To 10If score(i) < score(minno) Thenminno = iEnd IfIf score(i) > score(maxno) Thenmaxno = iEnd IfNext iFor i = 1 To 10sum = sum + score(i)Next isum = sum - score(minno) - score(maxno)aver = sum / 8Debug.Print "该选手的平均分是:"; averEnd Sub(9)关于素数的求解(9-1)求100之内的所有素数Public Sub 求所有素数之和()Dim s, w, n As Integers = 0For w = 2 To 99 Step 2For n = 2 To Sqr(w)If w Mod n = 0 ThenExit ForEnd IfNextIf n > Sqr(w) Thens = s + wEnd IfDebug.Print "S="; sNextEnd Sub(9-2)Public Sub 求200以内的所有素数()Dim w, n As IntegerDebug.Print "200 以内的所有素数是:" For w = 2 To 199For n = 2 To Sqr(w)If w Mod n = 0 ThenExit ForEnd IfNext nIf n > Sqr(w) ThenDebug.Print w;End IfNextDebug.PrintEnd Sub(10)Public Sub 求水仙花数1()Dim i, j, k, n As IntegerDebug.Print "水仙花数是:"For i = 1 To 9For j = 0 To 9For k = 0 To 9n = i * 100 + j * 10 + kIf n = i * i * i + j * j * j + k * k * k ThenDebug.Print n;End IfNext kNext jNext iDebug.PrintEnd SubPublic Sub 求水仙花数2()Dim i, j, k, n As IntegerDebug.Print "水仙花数是:"For n = 150 To 999i = Int(n / 100)j = Int(n / 10 - i * 10)k = n Mod 10If n = i * i * i + j * j * j + k * k * k ThenDebug.Print n;End IfNextDebug.PrintEnd Subrun:水仙花数是:153 370 371 407(11)Public Sub 求分数数列和()Dim i, t, n As IntegerDim a, b, s As Singlen = 20a = 2:b = 1: s = 0For i = 1 To ns = s + a / bt = aa = a + bb = tNextDebug.Print "sum="; s;End Sub(12)Public Sub N年达到的利息()Dim y As IntegerDim interest1,interest As DoubleP=10000y = 0interest = 0Do Until interest >= 1000Interest1 =2*p* 0.0225 *(1-0.2) ‘一期2年整存整取扣税后的利息p=p+interest1 ‘扣税后的利息加上本金成为新一期的本金Interest=p-10000 ‘存款以来实际所的利息y = y + 2Debug.Print interest, yLoopEnd SubRun:360 2732.959999999999 4 1119.34656 6。
MYSQL存储过程注释详解

MYSQL存储过程注释详解⽬录1.使⽤说明2.准备3.语法3.1 变量及赋值3.2 ⼊参出参3.3 流程控制-判断3.4 流程控制-循环3.5 流程控制-退出、继续循环3.6 游标3.7 存储过程中的handler4.练习4.1 利⽤存储过程更新数据4.3 其他场景:5.其他5.1 characteristic5.2 死循环处理5.3 可以在select语句中写case5.4 临时表0.环境说明:软件版本mysql8.0navicat1.使⽤说明存储过程时数据库的⼀个重要的对象,可以封装SQL语句集,可以⽤来完成⼀些较复杂的业务逻辑,并且可以⼊参出参(类似于java中的⽅法的书写)。
创建时会预先编译后保存,⽤户后续的调⽤都不需要再次编译。
// 把editUser类⽐成⼀个存储过程public void editUser(User user,String username){String a = "nihao";user.setUsername(username);}main(){User user = new User();editUser(user,"张三");user.getUseranme(); //java基础}⼤家可能会思考,⽤sql处理业务逻辑还要重新学,我⽤java来处理逻辑(⽐如循环判断、循环查询等)不⾏吗?那么,为什么还要⽤存储过程处理业务逻辑呢?优点:在⽣产环境下,可以通过直接修改存储过程的⽅式修改业务逻辑(或bug),⽽不⽤重启服务器。
执⾏速度快,存储过程经过编译之后会⽐单独⼀条⼀条执⾏要快。
减少⽹络传输流量。
⽅便优化。
缺点:过程化编程,复杂业务处理的维护成本⾼。
调试不便不同数据库之间可移植性差。
-- 不同数据库语法不⼀致!2.准备数据库参阅资料中的sql脚本:delimiter $$ --声明结束符3.语法官⽅参考⽹址:#### 3.0 语法结构```sql-- 存储过程结构CREATE[DEFINER = user]PROCEDURE sp_name ([proc_parameter[,...]])[characteristic ...] routine_body-- 1. proc_parameter参数部分,可以如下书写:[ IN | OUT | INOUT ] param_name type-- type类型可以是MySQL⽀持的所有类型-- 2. routine_body(程序体)部分,可以书写合法的SQL语句 BEGIN ... END简单演⽰:-- 声明结束符。
达梦数据库系统存储过程介绍

达梦数据库系统存储过程介绍DM是达梦数据库有限公司推出的新一代高性能、高安全性的数据库产品。
它具有开放的、可扩展的体系结构,高性能事务处理能力,以及低廉的维护成本。
现在长沙做网站工作室对达梦数据库系统存储过程介绍。
SQL语句执行的时候要先编译,然后执行。
存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,由流控制和SQL语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,应用程序使用时只要调用即可。
用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。
存储过程是现代数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。
存储过程是利用数据库系统所提供的Tranact-SQL语言所编写的程序。
Tranact-SQL语言是数据库系统提供专为设计数据库应用程序的语言,它是应用程序和数据库间的主要程序式设计界面。
这类语言主要提供以下功能,让用户可以设计出符合引用需求的程序:1. 变量说明;2. ANSI兼容的SQL命令(如SELECT、UPDATE………);3. 一般流程控制命令(IF…ELSE;WHILE………);4. 内部函数。
使用存储过程具有以下的一些优点:1. 存储过程的能力大大增强了SQL语言的功能和灵活性。
sql语句中的日期运算等一系统运算灵活性增强。
存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。
2. 可保证数据的安全性和完整性。
(1) 通过存储过程可以使没有权限的用户在控制之下间接地存取数据库,从而保证数据的安全;(2) 通过存储过程可以使相关的动作在一起发生,从而可以维护数据库的完整性。
3. 在运行存储过程前,数据库已对其进行了语法和句法分析,并给出了优化执行方案。
这种已经编译好的过程可极大地改善SQL语句的性能。
由于执行SQL语句的大部分工作已经完成,所以存储过程能以极快的速度执行。
idea的database写存储过程

idea的database写存储过程
要在数据库中编写存储过程,你可以使用SQL语言来创建和
定义存储过程。
下面是一个示例代码,展示了如何在数据库中创建一个存储过程:
```sql
CREATE PROCEDURE GetCustomerByID
@customerId INT
AS
BEGIN
SELECT * FROM Customers WHERE CustomerID =
@customerId
END
```
在上面的示例中,我们创建了一个名为"GetCustomerByID"的
存储过程。
该存储过程接受一个名为"customerId"的输入参数,并通过SELECT语句从名为"Customers"的表中获取具有指定
ID的客户信息。
要执行存储过程,可以使用以下代码:
```sql
EXEC GetCustomerByID @customerId = 1
```
在上面的示例中,我们调用了"GetCustomerByID"存储过程,
并将"customerId"参数的值设置为1。
执行存储过程将返回具
有ID为1的客户信息。
除了SELECT语句,存储过程还可以包含其他类型的SQL语句,如INSERT、UPDATE和DELETE语句,以及控制流语句(如IF和WHILE)。
您可以根据具体的需求在存储过程中编写相应的代码逻辑。
mysql 存储过程写法

mysql 存储过程写法MySQL 存储过程的写法如下:1. 创建存储过程```CREATE PROCEDURE procedure_name (in parameter_type parameter_name, out parameter_type parameter_name, inout parameter_type parameter_name)BEGIN-- 存储过程体END;```其中,`parameter_type` 表示参数类型,`parameter_name` 表示参数名称。
`in` 表示输入参数,`out` 表示输出参数,`inout` 表示传入传出参数。
2. 编写存储过程体存储过程体是存储过程的主体部分,通过 SQL 语句实现所需的功能。
```BEGIN-- 声明变量DECLARE variable_name variable_type;-- 赋值SET variable_name = value;-- 条件判断IF condition THEN-- SQL 语句ELSE-- SQL 语句END IF;-- 循环语句WHILE condition DO-- SQL 语句END WHILE;-- 返回结果SELECT column_name INTO variable_name FROM table_name WHERE condition;END;```3. 调用存储过程调用存储过程,使用 `CALL` 关键字和存储过程名称。
```CALL procedure_name(parameter);```其中,`parameter` 是存储过程的参数,可根据需要传入相应的值。
Removed_数据库第8-11章习题

Removed_数据库第8-11章习题第8章数据库编程⼀、选择题1、修改存储过程使⽤的语句是()。
A. ALTER PROCEDUREB. DROP PROCEDUREC. INSERT PROCEDUED. DELETE PROCEDUE2、创建存储过程的语句是()。
A. ALTER PROCEDUREB. DROP PROCEDUREC. CREATE PROCEDUED. INSERT PROCEDUE3、下⾯()组命令,将变量count值赋值为1。
A.DECLARE @countSELECT @count=1B.DIM count=1C.DECLARE count SELECT count=1D.DIM @count SELECT @count=14、在SQL Server 中删除存储过程⽤()。
A.ROLLBACK B. DROP PROC C.DELALLOCATE D. DELETE PROC10.在SQL Server 编程中,可使⽤()将多个语句捆绑。
A.{} B. BEGIN-END C.( ) D. [ ]⼆、填空题1、在T-SQL编程语句中,WHILE结构可以根据条件多次重复执⾏⼀条语句或⼀个语句块,还可以使⽤()和 CONTINUE 关键字在循环内部控制 WHILE 循环中语句的执⾏。
2、存储过程是存放在()上的预先定义并编译好的T-SQL语句。
3、游标是系统为⽤户开设的⼀个(),存放SQL语句的执⾏结果第9章关系查询处理和查询优化课后作业:P275,2题答案:12、事务的原⼦性是指。
A.事务中包括的所有操作要么都做,要么都不做B.事务⼀旦提交,对数据库的改变是永久的C.⼀个事务内部的操作及使⽤的数据对并发的其他事务是隔离的D.事务必须是使数据库从⼀个⼀致性状态变到另⼀个⼀致性状态3、事务的⼀致性是指。
A.事务中包括的所有操作要么都做,要么都不做B.事务⼀旦提交,对数据为的改变是永久的C.⼀个事务内部的操作及使⽤的数据对并发的其他事务是隔离的D.事务必须是使数据库从⼀个⼀致性状态变到另⼀个⼀致性状态4、事务的隔离性是指。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
创建存储过程语法形式如下: CREATE PROC[EDURE] 存储过程名 [;版本号] [ {@参数1 数据类型} [VARYING] [= 默认值] [OUTPUT], …… , {@参数n 数据类型} [VARYING] [= 默认值] [OUTPUT] ] [WITH {RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION} ] [FOR REPLICATION] AS SQL语句 ……
GO
EXEC student_info
(2) 使用带参数的存储过程
【例2】从数据库的三个表中查询某人指定课程的成绩和学分。该 存储过程接受与传递参数精确匹配的值。 USE 魏菊丽20086666 GO /*检查是否已存在同名的存储过程,若有,删除。*/ IF EXISTS (SELECT name FROM sysobjects WHERE name = 'student_info1' AND type = 'P') DROP PROCEDURE student_info1 GO CREATE PROCEDURE student_info1 @name char (8),@cname char(15)
(3) 临时存储过程 属于本地存储过程。如果本地存储过程的名称前面有一个“#”,该 存储过程就称为局部临时存储过程,这种存储过程只能在一个用户会 话中使用;如果本地存储过程的名称前面有两个“##”,该存储过程就 称为全局临时存储过程,这种存储过程可以在所有用户会话中使用。
(4) 远程存储过程 远程存储过程指从远程服务器上调用的存储过程。
……
8.3.3 重命名和删除存储过程
1. 重命名存储过程
修改存储过程的名称可以使用系统存储过程sp_rename, 其语法形式如下:
sp_rename 原存储过程名称,新存储过程名称
•
另外,通过对象资源管理器也可以修改存储过程的名称。
2. 删除存储过程
• 删除存储过程可以使用DROP命令,DROP命令可以将一 个或者多个存储过程或者存储过程组从当前数据库中删除, 其语法形式如下: • drop procedure {procedure} [,…n] • 当然,利用对象资源管理器也可以很方便地删除存储过程。
(5) 扩展存储过程 在SQL Server环境之外执行的动态链接库称为扩展存储过程,其前 缀是sp_。使用时需要先加载到SQL Server系统中,并且按照使用存储 过程的方法执行。
8.3.1 创建存储过程
利用对象资源管理器创建 利用T-SQL语句创建(Create Procedure)
创建存储过程时,需要确定存储过程的三个组成部分:
执行存储过程:
•直接执行存储过程可以使用EXECUTE命令来执行,其语 法形式如下: [[EXEC[UTE]] { [@return_status=] {procedure_name[;number] |@procedure_name_var} [[@parameter=]{value|@variable[OUTPUT |[DEFAULT]}] [,...n] [ WITH RECOMPILE ]
AS
SELECT student.sno, sname, cname, grade, ccredit FROM student ,sc,course where student.sno = sc.sno and o=o and student.sname=@name and ame=@cname GO
例:如果要通过SQL命令定义一个存储过程查询魏菊丽20086666 数据库中每个同学各门功课的成绩,然后调用该存储过程步骤如下:
定义如下存储过程
USE 魏菊丽20086666 Go CREATE PROCEDURE student_grade AS SELECT student.sno,student.sname,ame, sc.grade FROM student,sc,course WHERE student.sno=sc.sno AND o=o Go 调用存储过程 EXEC student_grade GO
参数的意义如下: • 如果执行存储过程的语句是批处理中的第一条语句,可以 省略EXECUTE关键字。 • @return_status:为整型局部变量,用于保存存储过程 的返回值。 • @procedure_name_var:为存储过程名。 • @parameter:为创建存储过程时定义的参数名。 • Value:为存储过程实参。 • @variable:为变量,用于保存OUTPUT参数返回的值。 • DEFAULT:表示不提供实参,使用对应的默认值。 • WITH RECOMPILE:强制编译。
2. 修改存储过程 • 修改存储过程的语法如下: ALTER PROC[EDURE] 存储过程名 [;版本号] [ {@ 参 数 1 数 据 类 型 } [VARYING] [= DEFAULT] [OUTPUT], …… , {@ 参 数 n 数 据 类 型 } [VARYING] [= DEFAULT] [OUTPUT] ] [WITH {RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION} ] [FOR REPLICATION] AS SQL语句
三、存储过程的类型
(1) 系统存储过程 是由系统提供的存储过程,作为命令执行各种操作。它定义在系统数据 库master中,其前缀是sp_,例如sp_addtype。系统存储过程可在任何 数据库中使用。 (2) 本地存储过程 是指在用户数据库中创建的存储过程,这种存储过程完成特定数据库操 作任务,其名称不能以sp_为前缀。
如果一个输出参数的类型为游标, 必须同时指定 VARYING和OUTPUT。 RECOMPILE:表明存储过程每次执行时重新编译。 ENCRYPTION :表示加密了syscomments 表中包含 CREATE PROCEDURE 语句文本的条目。这样可防止过 程作为SQL Server复制的一部分发布,防止用户使用系 统存储过程读取存储过程的定义文本。 FOR REPLICATION:只能在复制过程中执行。本选项 不能和WITH RECOMPILE选项一起使用。 AS:用于指定该存储过程要执行的操作。 SQL 语句:是存储过程中要包含的任意数目和类型的 Transact-SQL 语句。
•可供使用的系统存储过程及其语法形式如下: •sp_help:用于显示存储过程的参数及其数据类型 • sp_help [[@objname=] name] • 参数name为要查看的存储过程的名称。 •sp_helptext:用于显示存储过程的源代码 • sp_helptext [[@objname=] name] • 参数name为要查看的存储过程的名称。 •sp_depends:用于显示和存储过程相关的数据库对象 • sp_depends [@objname=]’object’ • 参数object为要查看依赖关系的存储过程的名称。 •sp_stored_procedures:用于返回当前数据库中的存储过 程列表
参数的意义如下:
存储过程名:要符合标识符规则,少于128个字符。 版本号:该参数是可选的整数,它用来对同名的存储过程 分组,以便用一条 DROP PROCEDURE 语句即可将同 组的过程一起除去。 @参数:过程中的参数。在 CREATE PROCEDURE 语 句中可以声明一个或多个参数。执行存储过程时应提供相 应的实参,除非定义了该参数的默认值,默认值只能是常 量。 VARYING:用于指定作为输出OUTPUT参数支持的结果 集(仅适用于游标参数)。 OUTPUT:用于指定参数从存储过程返回信息,可将信 息返回给调用过程。
EXEC student_info1 '李勇','数据库'
(3) 使用带有通配符参数的存储过程
【例3】从三个表的联接中返回指定学生的学号、姓名、所选课程名 称及该课程的成绩。该存储过程在参数中使用了模式匹配,如果没有提 供参数,则使用预设的默认值。 USE 魏菊丽20086666 GO IF EXISTS (SELECT name FROM sysobjects WHERE name = 'student_info2' AND type = 'P') DROP PROCEDURE student_info2 GO CREATE PROCEDURE student_info2 @name varchar(30) = '刘%' AS SELECT student.sno, sname, cname, grade, ccredit FROM student ,sc,course where student.sno = sc.sno and o=o and sname LIKE @name GO
GO /*创建存储过程*/
CREATE PROCEDURE student_info AS SELECT student.sno, sname, cname, grade, ccredit FROM student ,sc,course WHERE student.sno = sc.sno and o=o
①所有的输入参数以及传给调用者的输出参数。 ②被执行的操作语句(针对数据库), 包括调用其它存储过 程的语句。 ③返回给调用者的状态值,以指明调用是成功还是失败。
1. 使用CREATE PROCEDURE命令创建存储过程 • 创建存储过程前,应该考虑下列几个事项: • ①不能将 CREATE PROCEDURE 语句与其它 SQL 语句组合到单个批处理中。 • ②创建存储过程的权限默认属于数据库所有者,该所 有者可将此权限授予其他用户。 • ③存储过程是数据库对象,其名称必须遵守标识符规 则。 • ④只能在当前数据库中创建存储过程。 • ⑤一个存储过程的最大尺寸为128M。