数据库系统概论 an introduction to database system 第八章 数据库编程

39
数数数数 数数 An Introduction to Database System 数数数 数数数数数

Upload: renee-bradshaw

Post on 03-Jan-2016

193 views

Category:

Documents


0 download

DESCRIPTION

数据库系统概论 An Introduction to Database System 第八章 数据库编程. 代码注入. 注释 T-SQL 中注释两种方式: /* 注释语句* / -- 注释语句 批处理 批处理是包含一个或多个 T-SQL 语句的组,从应用程序一次性地发送到 SQL Server 执行。 Go 指令 用信号通知 SQL Server 实用工具一批 T-SQL 语句的结束。. 2. T-SQL 语法. 声明局部变量 使用 Declare 语句声明局部变量 语法: - PowerPoint PPT Presentation

TRANSCRIPT

数据库系统概论An Introduction to Database System

第八章 数据库编程

代码注入

2. T-SQL 语法• 注释

•T-SQL 中注释两种方式:•/* 注释语句 */•-- 注释语句

• 批处理•批处理是包含一个或多个 T-SQL 语句的组,从应用

程序一次性地发送到 SQL Server 执行。• Go 指令

•用信号通知 SQL Server 实用工具一批 T-SQL 语句的结束。

局部变量• 声明局部变量

•使用 Declare 语句声明局部变量•语法:•Declare @variable_name <datatype>[,…n]

• 给局部变量赋值•使用 Select 语句•Select @variablel_name = expression [From table_name [,…

n] Where clause ]

•使用 Set 语句•Set @variable_name = expression [,…n]

• 查看变量的值•Select @variable_name

use students

declare @number varchar(10), @name varchar(10)

set @number ='111‘

select @name=name from students where number=@number

select @number as number,@name as name

全局变量• @@error

•每条 Transact-SQL 语句执行后,将会对 @@error 赋值。 0代表语句执行成功。 1 代表失败。

• @@rowcount•每条 T-SQL 语句执行后,服务器把此次执行影响的列数返回给

@@rowcount 以判断是否正常执行。• @@fetch_status

•如果最后一次提取的状态为成功状态,则为 0 。如果出错,则为 -1 。

T-SQL 控制语句• Begin …End 语句块• If … Else 条件判断结构• While 循环• Case 多重判断结构• Return 语句

Begin …End 语句块• Begin …End 可以将一组 SQL 语句封装成一个语句块(出

于编程的需要)。• 任何时候当控制流语句必须执行一个包含两条或两条以上 T-SQL 语句的语句块时,请使用 BEGIN 和 END 语句。

• BEGIN 和 END 语句必须成对使用:任何一条语句均不能单独使用。

IF … ELSE 条件判断结构• 在执行 T-SQL 语句时强加条件。• 如果条件满足(布尔表达式返回 TRUE 时),则执行 IF

关键字后的 T-SQL 语句;当不满足 IF 条件时(布尔表达式返回 FALSE ),就执行 ELSE 关键字后的 T-SQL 语句

• 语法:•IF Boolean_expression• { sql_statement | statement_block } •[ELSE IF Boolean_expression]• { sql_statement | statement_block } •[ ELSE• { sql_statement | statement_block } ]

While 循环• 设置重复执行 SQL 语句或语句块的条件。• 只要指定的条件为真,就重复执行 WHILE 后面的 T-SQL

语句。• 可以使用 BREAK 和 CONTINUE 关键字在循环内部控制 WHILE 循环中语句的执行。

• 语法:•WHILE Boolean_expression• { sql_statement | statement_block }• [ BREAK ]• { sql_statement | statement_block }• [ CONTINUE ]

Case 多重判断结构• 计算条件列表并返回多个可能结果表达式之一。 • CASE 具有两种格式:

•简单 CASE 函数将某个表达式与一组简单表达式进行比较以确定结果。

CASE input_expression WHEN when_expression THEN result_expression [ ...n ] [ ELSE else_result_expression ]END

•CASE 搜索函数计算一组布尔表达式以确定结果。 CASE WHEN Boolean_expression THEN result_expression [ ...n ] [ ELSE else_result_expression ]END

Return 语句• 从查询或过程中无条件退出。• RETURN 即时且完全,可在任何时候用于从过程、批处理

或语句块中退出,不执行位于 RETURN 之后的语句。• 语法:

•RETURN [ integer_expression ]

• 除非特别指明,所有系统存储过程返回 0 值表示成功,返回非零值则表示失败。

游标• Transact-SQL 游标主要用在存储过程、触发器和Transact-SQL 脚本中,它们使结果集的内容对其它Transact-SQL 语句同样可用。

• 使用游标有四种基本的步骤 :•声明游标 DECLARE CURSOR •打开游标 OPEN•提取数据 FETCH•关闭游标 CLOSE•释放游标 DEALLOCATE

声明游标• DECLARE cursor_name CURSOR • FOR select_statement • 例:

DECLARE authors_cursor2 CURSOR FOR

SELECT au_id, au_fname, au_lname

FROM authors

WHERE state = "UT"

ORDER BY au_id

打开游标• OPEN cursor_name

• CLOST cursor_name

• DEALLOCATE

关闭游标

释放游标

提取数据• 当用 OPEN 语句打开了游标并在数据库中执行了查询后 ,

您不能立即利用在查询结果集中的数据。• 您必须用 FETCH 语句来取得数据。• 一条 FETCH 语句一次可以将一条记录放入程序员指定的变

量中。• 事实上 ,FETCH 语句是游标使用的核心。

FETCH语法• FETCH [ [ NEXT | PRIOR | FIRST | LAST• | ABSOLUTE { n | @nvar }• | RELATIVE { n | @nvar } ] • FROM• ] • { cursor_name | @cursor_variable_name } • [ INTO @variable_name [ ,...n ] ]

例:use students

declare test cursor for select number,name from students

open test

declare @line varchar(10),@n varchar(10)

fetch next from test into @n,@line

while(@@FETCH_STATUS=0)

begin

print @line+' '+@n

fetch next from test into @n,@line

end

close test

deallocate test

3. SQL Server 存储过程• 1. 存储过程概念• 存储过程是一种数据库对象,是为了实现某个特定任务,

将一组预编译的 SQL 语句以一个存储单元的形式存储在服务器上,供用户调用。存储过程在第一次执行时进行编译,然后将编译好的代码保存在高速缓存中以便以后调用,这样可以提高代码的执行效率。

2 、存储过程的特点• 接收输入参数并以输出参数的形式将多个值返回至调用过

程或批处理。• 包含执行数据库操作(包括调用其它过程)的编程语句。• 向调用过程或批处理返回状态值,以表明成功或失败以及

失败原因。

• 3. 优点• 安全机制:只给用户访问存储过程的权限,而不授予用户访问表和视图的权限。

• 改良了执行性能:只在第一次执行时进行编译,以后执行无需重新编译,而一般 SQL 语句每执行一次就编译一次。

• 减少网络流量:存储过程存在于服务器上,调用时,只需传递执行存储过程的执行命令和返回结果。

• 模块化的程序设计:增强了代码的可重用性,提高了开发效率。

• 4. 存储过程类型• 用户定义的存储过程:用户定义的存储过程是用户根据需

要,为完成某一特定功能,在自己的普通数据库中创建的存储过程。

• 系统存储过程:系统存储过程以 sp_ 为前缀,主要用来从系统表中获取信息,为系统管理员管理 SQL Server 提供帮助,为用户查看数据库对象提供方便。比如用来查看数据库对象信息的系统存储过程 sp_help 。从物理意义上讲,系统存储过程存储在资源数据库中。从逻辑意义上讲,系统存储过程出现在每个系统定义数据库和用户定义数据库的 sys 构架中。

注意事项• 只能在当前数据库中创建存储过程。• 数据库的所有者可以创建存储过程,也可以授权其他用户创建存储过程。

• 存储过程是数据库对象,其名称必须遵守标识符命名规则。• 不能将 CREATE PROCEDURE 语句与其它 SQL 语句

组合到单个批处理中。

简单存储过程使用 SQL 语句创建不带参数的存储过程语法格式如下:

CREATE PROC [ EDURE ] procedure_name [;number]

[ WITH { RECOMPILE|ENCRYPTION|RECOMPILE, ENCRYPTION}]

AS sql_statement [ ...n ]• procedure_name :新存储过程的名称。过程名必须符合标识符规则,且对于数据库及其所有者必须唯一。

• RECOMPILE : SQL 不会缓存该过程的计划,该过程将在运行时重新编译。

• ENCRYPTION :存储过程加密。• number: 是可选的整数,用来对同名的过程分组,以便用一

条 DROP PROCEDURE 语句即可将同组的过程一起除去。

执行存储过程• 可以使用 EXECUTE 命令或其名称执行它,其语法格式如下:

• [ EXEC [ UTE ] ] procedure_name [number ] • 注:如果存储过程是批处理中的第一条语句, EXECUTE命令可以省略,可以使用存储过程的名字执行该存储过程。

• 例 use students

go

create proc up_students

as

select * from students

Exec up_students

修改简单存储过程• 修改存储过程的 T-SQL 语句为 ALTER PROCEDURE ,其

语法格式为:• ALTER PROC [ EDURE ] procedure_name [ ; number ]• [ { @parameter data_type }[ = default ] [ OUTPUT ] ]

[ ,...n ] • [ WITH { RECOMPILE | ENCRYPTION}]• [ FOR REPLICATION ] • AS• sql_statement [ ...n ]

删除存储过程• 使用 DROP PROCEDURE 语句删除存储过程• DROP PROCEDURE 语句可以一次从当前数据库中将一

个或多个存储过程或过程组删除,其语法格式如下:• DROP PROCEDURE 存储过程名称 [,…n]• 例:删除存储过程。代码如下:• USE shop• GO• DROP PROCEDURE up_GoodsTypes• GO

含参数的存储过程• 使用 SQL 语句创建带参数的存储过程语法格式如下:• CREATE PROC [ EDURE ] procedure_name [number ]

• [ { @parameter data_type } [ = default ] [ OUTPUT ]] [ ,...n ]

• [ WITH• { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION}

• ] • AS sql_statement [ ...n ]

• OUTPUT :表明参数是返回参数。该选项的值可以返回给EXEC[UTE] 。使用 OUTPUT参数可将信息返回给调用过程。

• parameter :存储过程中的输入和输出参数。• data_type :参数的数据类型。• Default :指参数的默认值,必须是常量或 NULL 。如果

定义了默认值,不必指定该参数的值即可执行过程。

输入参数的使用•在学生数据库中创建存储过程,该存储过程用于根据性别查询学生信息,包括一个输入参数,用于输入要查询的学生的性别use studentsgocreate proc up_query@condition varchar(10)asselect * from students where sex=@condition

执行带参存储过程• 按位置传递:在调用存储过程时,直接给出参数值。如果

多于一个参数,给出的参数值要与定义的参数的顺序一致。• 使用参数名称传递:在调用存储过程时,按“参数名 = 参

数值”的形式给出参数值。采用此方式,参数如果多于一个时,给出的参数顺序可以与定义的参数顺序不一致。

• 如:执行存储过程 up_query ,查看 “通信产品”的班级名称,代码如下:

• EXEC up_query ‘男’• EXEC up_query @condition=‘男’

参数所默认值

use studentsgocreate proc up_query@condition varchar(10)=‘男’asselect * from students where sex=@condition

输出参数的使用

use studentsgocreate proc up_output_name@number varchar(10),@name varchar(10) outputasselect name from students where number=@number执行•use students•declare @name varchar(10)•exec up_output_name '111', @name output•select @name

使用 return 语句返回值•只能返回整数use studentsgocreate proc up_return @number varchar(10)asbegin select name from students where number=@number return @@ROWCOUNT end执行declare @lines intexec @lines=up_return '111'

VBA调用存储过程访问数据集 Dim conn As New ADODB.Connection Dim commd As New ADODB.Command Dim rs As New ADODB.Recordset

Dim conStr As String conStr = "provider=SQLOLEDB;Server=HITLIC\SQLEXPRESS;Database=students;User ID=sa;Password=123456;" conn.Open conStr commd.ActiveConnection = conn commd.CommandType = adCmdStoredProc commd.CommandText = "up_students" Set rs = commd.Execute Dim i As Integer i = 1 Do While Not rs.EOF Sheet1.Cells(i, 1) = rs.Fields(1) i = i + 1 rs.MoveNext Loop rs.Close conn.Close

VBA调用带参存储过程( 1 )——返回记录集 Dim conn As New ADODB.Connection Dim commd As New ADODB.Command Dim rs As New ADODB.Recordset

Dim conStr As String conStr = "provider=SQLOLEDB;Server=HITLIC\SQLEXPRESS;Database=students;User ID=sa;Password=123456;" conn.Open conStr commd.ActiveConnection = conn commd.CommandType = adCmdStoredProc commd.CommandText = "up_getone" commd.Parameters(1) = "111" Set rs = commd.Execute If Not rs.EOF Then Sheet1.Cells(1, 1) = rs.Fields(1) End If rs.Close conn.Close

VBA调用带参存储过程( 1 )——返回参数 Dim conn As New ADODB.Connection Dim commd As New ADODB.Command

Dim conStr As String conStr = "provider=SQLOLEDB;Server=HITLIC\SQLEXPRESS;Database=students;User ID=sa;Password=123456;" conn.Open conStr commd.ActiveConnection = conn commd.CommandType = adCmdStoredProc commd.CommandText = "up_getone1" commd.Parameters(1) = "111"或 commd.Parameters("@number") = "111" commd.Execute Dim xx As String xx = commd.Parameters(2)或 xx = commd.Parameters("@name") MsgBox xx conn.Close

VBA调用带参存储过程( 2 ) Dim conn As New ADODB.Connection Dim commd As New ADODB.Command

Dim conStr As String conStr = "provider=SQLOLEDB;Server=HITLIC\SQLEXPRESS;Database=students;User ID=sa;Password=123456;" conn.Open conStr commd.ActiveConnection = conn commd.CommandType = adCmdStoredProc commd.CommandText = "up_getone1" Dim pin, pout Set pin = commd.CreateParameter("in", adChar, adParamInput, 10, "111") Set pout = commd.CreateParameter("out", adChar, adParamOutput, 10) commd.Parameters.Append pin commd.Parameters.Append pout commd.Execute MsgBox commd.Parameters("out") conn.Close

VBA调用存储过程——返回 return 值 Dim conn As New ADODB.Connection Dim commd As New ADODB.Command

Dim conStr As String conStr = "provider=SQLOLEDB;Server=HITLIC\SQLEXPRESS;Database=students;User ID=sa;Password=123456;" conn.Open conStr commd.ActiveConnection = conn commd.CommandType = adCmdStoredProc commd.CommandText = "up_getone2" commd.Parameters(0).Direction = adParamReturnValue commd.Execute MsgBox commd.Parameters(0) conn.Close