




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、数据库原理,第四讲 SQL Server与数据查询 续,蒲 飞,QQ:1150636618,T-SQL回顾,指出下列语句的错误:,CREATE TABLE bank ( userName VARCHAR(10), balance MONEY ) INSERT INTO bank(userName,balance) VALUES(张三,500) INSERT INTO bank(userName,balance) VALUES(李四,700) DECLARE mymoney INT(4) mymoney=0 SELECT mymoney=balance FROM bank,建表语句后必须添加GO
2、标志,DECLARE mymoney INT,SET mymoney=0,WHERE userName=张三,T-SQL回顾,IF mymoney 1000 THEN balance*0.20 WHEN ELSE balance*0.10 FROM bank WHERE userName=张三 GO,多条语句添加BEGIN-END,去掉WHEN,缺少配对的END,转换:convert(varchar(5), mymoney),什么是存储过程,存储过程(procedure)类似于C语言中的函数 用来执行管理任务或应用复杂的业务规则 存储过程可以带参数,也可以返回结果,int sum(int a,
3、int b) int s; s =a+b; return s ; ,存储过程相当于C语言中的函数,什么是存储过程,存储过程 - - -,单个 SELECT 语句,SELECT 语句块,SELECT语句与逻辑控制语句,可以包含,存储过程可以包含数据操纵语句、变量、逻辑 控制语句等,存储过程的优点,执行速度更快 允许模块化程序设计 提高系统安全性 减少网络流通量,存储过程的分类,系统存储过程 由系统定义,存放在master数据库中 类似C语言中的系统函数 系统存储过程的名称都以“sp_”开头或”xp_”开头 用户自定义存储过程 由用户在自己的数据库中创建的存储过程 类似C语言中的用户自定义函数,常
4、用的系统存储过程,常用的系统存储过程,EXEC sp_databases EXEC sp_renamedb Northwind,Northwind1 USE stuDB GO EXEC sp_tables EXEC sp_columns stuInfo EXEC sp_help stuInfo EXEC sp_helpconstraint stuInfo EXEC sp_helpindex stuMarks EXEC sp_helptext view_stuInfo_stuMarks EXEC sp_stored_procedures,修改数据库的名称(单用户访问),列出当前系统中的数据库,当
5、前数据库中查询的对象的列表,返回某个表列的信息,查看表stuInfo的信息,查看表stuInfo的约束,查看表stuMarks的索引,查看视图的语句文本,查看当前数据库中的存储过程,创建存储过程,定义存储过程的语法 CREATE PROCEDURE 存储过程名 参数1 数据类型 = 默认值 OUTPUT, , 参数n 数据类型 = 默认值 OUTPUT AS SQL语句 GO 和C语言的函数一样,参数可选 参数分为输入参数、输出参数 输入参数允许有默认值,创建不带参数的存储过程,问题: 请创建存储过程,查看本次考试平均分以及未通过考试的学员名单,CREATE PROCEDURE proc_st
6、u AS DECLARE writtenAvg float,labAvg float SELECT writtenAvg=AVG(writtenExam), labAvg=AVG(labExam) FROM stuMarks print 笔试平均分:+convert(varchar(5),writtenAvg) print 机试平均分:+convert(varchar(5),labAvg) IF (writtenAvg70 AND labAvg70) print 本班考试成绩:优秀 ELSE print 本班考试成绩:较差 print - print 参加本次考试没有通过的学员: SELECT
7、 stuName,stuInfo.stuNo,writtenExam,labExam FROM stuInfo INNER JOIN stuMarks ON stuInfo.stuNo=stuMarks.stuNo WHERE writtenExam60 OR labExam60 GO,proc_stu为存储过程的名称,笔试平均分和机试平均分变量,显示考试成绩的等级,显示未通过的学员,调用存储过程,EXECUTE(执行)语句用来调用存储过程 调用的语法 EXEC 过程名 参数 EXEC proc_stu,存储过程的参数,存储过程的参数分两种: 输入参数 输出参数 输入参数: 用于向存储过程传入
8、值,类似C语言的按值传递; 输出参数: 用于在调用存储过程后, 返回结果,类似C语言的 按引用传递;,int sum (int a, int b) int s; s=a+b; return s; ,c=sum(5, 8),传入参数值,返回结果,带输入参数的存储过程,问题: 修改上例:由于每次考试的难易程度不一样,每次 笔试和机试的及格线可能随时变化(不再是60分),这导致考试的评判结果也相应变化。,分析: 在述存储过程添加2个输入参数: writtenPass 笔试及格线 labPass 机试及格线,带输入参数的存储过程,CREATE PROCEDURE proc_stu writtenPas
9、s int, labPass int AS print - print 参加本次考试没有通过的学员: SELECT stuName,stuInfo.stuNo,writtenExam, labExam FROM stuInfo INNER JOIN stuMarks ON stuInfo.stuNo=stuMarks.stuNo WHERE writtenExamwrittenPass OR labExamlabPass GO,输入参数:笔试及格线,输入参数:机试及格线,查询没有通过考试的学员,带输入参数的存储过程,EXEC proc_stu 60,55,调用带参数的存储过程 假定本次考试机试
10、偏难,机试的及格线定为55分,笔试及格线定为60分,-或这样调用: EXEC proc_stu labPass=55,writtenPass=60,输入参数的默认值,CREATE PROCEDURE proc_stu writtenPass int=60, labPass int=60 AS print - print 参加本次考试没有通过的学员: SELECT stuName,stuInfo.stuNo,writtenExam, labExam FROM stuInfo INNER JOIN stuMarks ON stuInfo.stuNo=stuMarks.stuNo WHERE wri
11、ttenExamwrittenPass OR labExamlabPass GO,笔试及格线:默认为60分,机试及格线:默认为60分,查询没有通过考试的学员,带输出参数的存储过程,如果希望调用存储过程后,返回一个或多个值,这时就需要使用输出(OUTPUT)参数了,问题: 修改上例,返回未通过考试的学员人数。若不及格人数超过50%,则及格分数线应适当下调。,带输出参数的存储过程,create procedure stupapram_proc writtenpass int=60, -输入参数的默认值 labpass int=60, -输入参数的默认值 total_num int output,
12、-输出参数 notpass_sum int output -输出参数 as print 笔试及格线:+convert(varchar(5),writtenpass) print 机试及格线:+convert(varchar(5),labpass) print - print 参加本次考试没有通过的学员 select stuName,stuInfo.stuNo,writtenExam,labExam from stuInfo inner join stuMarks on stuInfo.stuNo=stuMarks.stuNo where writtenExamwrittenpass or la
13、bExamlabpass select notpass_sum=COUNT(*) from stuMarks where writtenExamwrittenpass or labExamlabpass select total_num=COUNT(*) from stuInfo GO,输出(返回)参数:表示没有通过的人数,推荐将默认参数放后,统计并返回没有通过考试的学员人数,带输出参数的存储过程,/*-调用存储过程-*/ declare sum int,total int exec stupapram_proc 70,60, total output, sum output print -
14、if (convert(float,sum)/convert(float,total)=0.5 print 未通过考试的学生人数为:+convert(varchar(5),sum)+,不及格人数大于50%,及格分数线应适当下调。 else print 未通过考试的学生人数为:+convert(varchar(5),sum)+,不及格人数已控制在50%内,及格分数线比较适中。 go,调用带输出参数的存储过程,调用时必须带OUTPUT关键字 ,返回结果将存放在变量sum中,后续语句引用返回结果,存储过程-总结,存储过程是一组预编译的SQL语句,它可以包含数据操纵语句、变量、逻辑控制语句等 存储过程
15、允许带参数,参数分为: 输入参数 输出参数 其中,输入参数可以有默认值。 输入参数:可以在调用时向存储过程传递参数,此类参数可用来向存储过程中传入值 输出参数从存储过程中返回(输出)值,后面跟随OUTPUT关键字,触发器,为什么需要触发器 触发器的工作原理 如何使用inserted表和deleted表 如何创建: INSERT触发器 UPDATE触发器 DELETE触发器,为什么需要触发器,为什么需要触发器(TRIGGER)呢?典型的应用就是银行的取款机系统,帐户信息表bank,交易信息表transInfo,张三取钱200 问题: 没有自动修改张三的余额,最优的解决方案就是采用触发器: 它是一
16、种特殊的存储过程 也具备事务的功能 它能在多表之间执行特殊的业务规则,张三开户1000元,李四开户1元,什么是触发器,赵二,插入,删除,触发器触发,赵二退休,赵二,员工表,退休员工表,什么是触发器,触发器是在对表进行插入、更新或删除操作时自动执行的存储过程 触发器通常用于强制业务规则 触发器是一种高级约束,可以定义比用CHECK 约束更为复杂的约束 可执行复杂的SQL语句(if/while/case) 可引用其它表中的列,什么是触发器,触发器定义在特定的表上,与表相关 自动触发执行 不能直接调用 是一个事务(可回滚),触发器的类型,DELETE 触发器 INSERT 触发器 UPDATE 触发
17、器,inserted 和deleted 表,触发器触发时: 系统自动在内存中创建deleted表或inserted表 只读,不允许修改;触发器执行完成后,自动删除 inserted 表 临时保存了插入或更新后的记录行 可以从inserted表中检查插入的数据是否满足业务需求 如果不满足,则向用户报告错误消息,并回滚插入操作 deleted 表 临时保存了删除或更新前的记录行 可以从deleted表中检查被删除的数据是否满足业务需求 如果不满足,则向用户报告错误消息,并回滚删除操作,inserted 和deleted 表,inserted表和deleted表存放的信息,如何创建触发器,创建触发器
18、的语法:,CREATE TRIGGER trigger_name ON table_name WITH ENCRYPTION FOR DELETE, INSERT, UPDATE AS T-SQL语句 GO,WITH ENCRYPTION表示加密触发器定义的SQL文本 DELETE, INSERT, UPDATE指定触发器的类型,INSERT触发器,插入记录行,触发insert触发器。向inserted表中插入新行的副本,触发器检查inserted表中插入的新行数据,确定是否需要回滚或执行其他操作,INSERT触发器的工作原理:,INSERT 触发器示例,问题: 解决上述的银行取款问题:当向交
19、易信息表(transInfo)中插入一条交易信息时,我们应自动更新对应帐户的余额。,分析: 在交易信息表上创建INSERT触发器 从inserted临时表中获取插入的数据行 根据交易类型(transType)字段的值是存入/支取, 增加/减少对应帐户的余额。,INSERT 触发器示例,1、创建表bank和transinfo create table bank( customerName nvarchar(12) primary key, cardID int, currentMoney money ) insert into bank(customerName,cardID,currentMo
20、ney) values (张三,10010001,1000), (李四,10010002,1),INSERT 触发器示例,create table transinfo( cardId int, transType nvarchar(10), transMoney money, transDate datetime ),INSERT 触发器示例,3、创建触发器 if exists(select name from sysobjects where name=trig_transInfo) drop trigger trig_transInfo go create trigger trig_tra
21、nsInfo on transinfo for insert as declare type nvarchar(10),withdrawal money, balance money, card int,-从inserted表中获取插入的记录信息 select type=transType, withdrawal=transMoney,card=cardID from inserted if type=支取 update bank set currentMoney=currentMoney-withdrawal where cardID=card else update bank set cu
22、rrentMoney=currentMoney+withdrawal where cardID=card,INSERT 触发器示例,if ERROR0 begin print 交易失败! rollback transaction return end,print 交易成功!交易金额: +convert(varchar(20),withdrawal) select balance=currentMoney from bank where cardID=card print 卡号: +convert(varchar(20),card)+ 余额: +convert(varchar(20),balan
23、ce) go,INSERT 触发器示例,-测试触发器,插入测试数据:张三取钱,李四存钱 insert into transinfo(cardID,transType,transMoney) values (10010001,支取,200) insert into transinfo(cardID,transType,transMoney) values (10010002,存入,50000),INSERT 触发器示例,(1 行受影响) 交易成功!交易金额:200.00 卡号:10010001 余额:800.00 (1 行受影响) 交易成功!交易金额:50000.00 卡号:10010002 余
24、额:50001.00,INSERT 触发器示例,select * from transinfo select * from bank,INSERT 触发器示例,-关键代码- CREATE TRIGGER trig_transInfo ON transInfo FOR INSERT AS DECLARE type char(4),outMoney MONEY DECLARE myCardID char(10),balance MONEY SELECT type=transType,outMoney=transMoney, myCardID=cardID FROM inserted IF (typ
25、e=支取) UPDATE bank SET currentMoney=currentMoney-outMoney WHERE cardID=myCardID ELSE UPDATE bank SET currentMoney=currentMoney+outMoney WHERE cardID=myCardID . GO,从inserted表中获取交易类型、教员金额等,根据交易类型,减少或增加对应卡号的余额,DELETE触发器,删除记录行,触发delete触发器向deleted表中插入被删除的副本,触发器检查deleted表中被删除的数据,决定是否需要回滚或执行其他操作,DELETE触发器的工
26、作原理:,DELETE触发器示例,问题: 当删除交易信息表时,要求自动备份被删除的数据到表backupTable中 。,分析: 在交易信息表上创建DELETE触发器 被删除的数据可以从deleted表中获取,DELETE触发器示例,if exists(select name from sysobjects where name=trig_delete_transinfo) drop trigger trig_delete_transinfo go create trigger trig_delete_transinfo on transinfo for delete as print 开始备份
27、数据,请稍后. if not exists(select name from sysobjects where name=backuptable) select * into backuptable from deleted -表backuptable还没创建建,将deleted表复制到表backuptable else insert into backuptable select * from deleted -从delete表中获取被删除的数据 print 备份数据成功!备份数据为: select * from backuptable go,DELETE触发器示例,-测试触发器 set n
28、ocount on -不显示影响的行数 delete transinfo print 交易数据表中的数据: select * from transinfo,DELETE触发器示例,-关键代码- CREATE TRIGGER trig_delete_transInfo ON transInfo FOR DELETE AS print 开始备份数据,请稍后. IF NOT EXISTS(SELECT * FROM sysobjects WHERE name=backupTable) SELECT * INTO backupTable FROM deleted ELSE INSERT INTO ba
29、ckupTable SELECT * FROM deleted print 备份数据成功,备份表中的数据为: SELECT * FROM backupTable GO,从deleted表中获取被删除的交易记录,UPDATE触发器,删除记录行,向deleted表中插入被删除的副本,检查deleted和inserted表中的数据,确定是否需要回滚或执行其他操作,UPDATE触发器的工作原理:,向inserted表中插入被添加的副本,插入记录行,UPDATE触发器,问题: 跟踪用户的交易,交易金额超过20000元,则取消交易,并给出错误提示。,分析: 在bank表上创建UPDATE触发器 修改前的数
30、据可以从deleted表中获取 修改后的数据可以从inserted表中获取,UPDATE触发器,if exists(select name from sysobjects where name=trig_update_bank) drop trigger trig_update_bank go create trigger trig_update_bank on bank for update as declare beforeTransaction money, afterTransaction money select beforeTransaction=currentMoney from
31、 deleted -获取交易前的余额 select afterTransaction=currentMoney from inserted -获取交易后的余额 if (ABS(afterTransaction-beforeTransaction)20000) begin print 交易金额:+ convert(varchar(12),ABS(afterTransaction-beforeTransaction) raiserror(每笔交易不能超过2万元,交易失败,16,1) rollback transaction end go,UPDATE触发器,-关键代码- CREATE TRIGGE
32、R trig_update_bank ON bank FOR UPDATE AS DECLARE beforeTransaction MONEY,afterTransaction MONEY SELECT beforeTransaction=currentMoney FROM deleted SELECT afterTransaction=currentMoney FROM inserted IF ABS(afterTransaction-beforeTransaction)20000 BEGIN print 交易金额:+convert(varchar(8), ABS(afterTransac
33、tion-beforeTransaction) RAISERROR (每笔交易不能超过2万元,交易失败,16,1) ROLLBACK TRANSACTION END GO,从deleted表中获取交易前的余额,从inserted表中获取交易后的余额,交易金额是否2万,回滚事务,撤销交易,UPDATE触发器,-测试触发器,更新数据 set nocount on update bank set currentMoney=currentMoney+25000 where cardID=10010001 go insert into transinfo(cardID,transType,transMo
34、ney) values (10010002,支取,30000) go insert into transinfo(cardID,transType,transMoney) values (10010002,存入,5000) go -查看结果 print 账户信息表中的数据: select * from bank print 交易信息表中的数据: select * from transinfo,列级 UPDATE 触发器,UPDATE触发器除了跟踪数据的变化(修改)外,还可以检查是否修改了某列的数据 使用UPDATE(列)函数检测是否修改了某列,问题: 交易日期一般由系统自动产生,默认为当前日期
35、。为了安全 起见,一般禁止修改,以防舞弊。,分析: UPDATE(列名)函数可以检测是否修改了某列,列级 UPDATE 触发器,-关键代码- CREATE TRIGGER trig_update_transInfo ON transInfo FOR UPDATE AS IF UPDATE(transDate) BEGIN print 交易失败. RAISERROR (安全警告:交易日期不能修改, 由系统自动产生,16,1) ROLLBACK TRANSACTION END GO,检查是否修改了交易日期列transDate,回滚事务,撤销交易,列级 UPDATE 触发器,-测试触发器: 插入交易
36、日期 set nocount on -不显示受影响的SQL语句行数 update transinfo set transDate=2012-9-23,DDL触发器,DDL 触发器是一种非凡的触发器,它在响应数据定义语言 (DDL) 语句时触发。与标准的DML触发器不同的是,DDL触发器并不在响应对表或视图的 UPDATE、INSERT 或 DELETE 语句时执行存储过程。 它们主要在响应数据定义语言 (DDL) 语句执行存储过程。 这些语句包括 CREATE、ALTER、DROP、GRANT、DENY、REVOKE 和 UPDATE STATISTICS 等语句。,DDL触发器,在数据库上建
37、立一个触发器阻止任何用户Create, Alter和Drop表或存储过程。我们假定有一个数据库叫DDLTrTest,这个数据库中有一个表(MyTable)。,DDL触发器,create database DDLTrTest go use DDLTrTest go create table mytable(id int,name varchar(10) go insert into mytable select 1,A insert into mytable select 2,B insert into mytable select 3,C insert into mytable select
38、4,D insert into mytable select 5,E insert into mytable select 6,F,DDL触发器,create trigger tri_DDL_table_proc on database for create_table,drop_table,alter_table,create_procedure, drop_procedure,alter_procedure as select EVENTDATA().value(EVENT_INSTANCE/TSQLCommand/commandText)1,nvarchar(max) print You
39、 are not allowed to create, alter, drop table and procedure rollback,DDL触发器,使用 EVENTDATA 函数,可以捕获有关激发 DDL 触发器的事件的信息。 此函数返回 xml 值。 XML 架构包括下列信息: 1、事件时间。 2、在执行触发器时,连接的系统进程 ID (SPID)。 3、激发触发器的事件类型。,DDL触发器,-测试触发器 alter table mytable add x int go drop table mytable go create procedure myproc as select * f
40、rom mytable,总结,触发器是在对表进行插入、更新或删除操作时自动执行的存储过程,触发器通常用于强制业务规则 触发器还是一个特殊的事务单元,当出现错误时,可以执行ROLLBACK TRANSACTION回滚撤销操作 触发器一般都需要使用临时表:deleted表和inserted表,它们存放了被删除或插入的记录行副本 触发器类型: INSERT触发器 UPDATE触发器 DELETE触发器,游标,为什么需要游标 游标的使用步聚 动态游标 游标:提取 综合示例,为什么需要游标,应用程序,特别是交互式联机应用程序,并不总能将整个结果集作为一个单元来有效地处理。这些应用程序需要一种机制以便每次
41、处理一行或一部分行。游标就是提供这种机制的结果集扩展。 游标通过以下方式扩展结果处理: 允许定位在结果集的特定行。 从结果集的当前位置检索一行或多行。 支持对结果集中当前位置的行进行数据修改。 为由其他用户对显示在结果集中的数据库数据所做的更改提供不同级别的可见性支持。 提供脚本、存储过程和触发器中使用的访问结果集中的数据的 Transact-SQL 语句。,游标的使用步聚,把游标与 Transact-SQL 语句的结果集相关联,并且定义游标的特征,如是否能够更新游标中的行。 执行 Transact-SQL 语句以填充游标。 检索想要查看的游标中的行。从游标中检索一行或多行的操作称为提取。执行
42、一系列的提取操作以向前或向后检索行的操作称为滚动。 根据需要,对游标中当前位置的行执行修改操作(更新或删除)。 关闭游标。 释放游标。,动态游标,FETCH 从 Transact-SQL 服务器游标中检索特定的一行。 语法 FETCH NEXT | PRIOR | FIRST | LAST| ABSOLUTE n | nvar | RELATIVE n | nvar FROM GLOBAL cursor_name | cursor_variable_name INTO variable_name ,.n ,FETCH_STATUS,FETCH_STATUS 返回被 FETCH 语句执行的最后游
43、标的状态,而不是任何当前被连接打开的游标的状态。 返回值描述 0 FETCH 语句成功 -1 FETCH 语句失败或此行不在结果集中 -2 被提取的行不存在 语法FETCH_STATUS 返回类型:integer 注释: 由于 FETCH_STATUS 对于在一个连接上的所有游标是全局性的,要小心使用 FETCH_STATUS 。在执行一条 FETCH 语句后,必须在对另一游标执行另一 FETCH 语句前测试 FETCH_STATUS 。在任何提取操作出现在此连接上前,FETCH_STATUS 的值没有定义。 例如,用户从一个游标执行一条 FETCH 语句,然后调用一个存储过程,此存储过程打开
44、并处理另一个游标的结果。当控制从被调用的存储过程返回后,FETCH_STATUS 反映的是在存储过程中执行的最后的 FETCH 语句的结果,而不是在存储过程被调用之前的 FETCH 语句。,例子一,使用游标实现:从Scot数据库emp表中查找出职位为clerk的员工,并逐个显示这些员工记录,包含字段姓名、职位和工资。 set nocount on declare emp_cursor cursor for select ename, job, sal from emp where job=clerk open emp_cursor -打开游标 fetch next from emp_curso
45、r -提取游标 while FETCH_STATUS=0 fetch next from emp_cursor close emp_cursor -关闭游标 deallocate emp_cursor -释放游标 go,例子二,使用FETCH 将值存入变量,与上例相似,但FETCH 语句的输出存储于局部变量而不是直接返回给客户端。PRINT 语句将变量组合成单一字符串并将其返回到客户端。 set nocount on declare name varchar(10),job varchar(9), sal money declare emp_cursor cursor for select e
46、name, job, sal from emp where job=clerk open emp_cursor fetch next from emp_cursor into name, job, sal while FETCH_STATUS=0 begin print 姓名:+name+ 职位:+job+ 薪水:+convert(varchar(10),sal) fetch next from emp_cursor into name, job, sal end close emp_cursor deallocate emp_cursor go,动态游标,参数 NEXT 返回紧跟当前行之后的
47、结果行,并且当前行递增为结果行。如果 FETCH NEXT 为对游标的第一次提取操作,则返回结果集中的第一行。NEXT 为默认的游标提取选项。 PRIOR 返回紧临当前行前面的结果行,并且当前行递减为结果行。如果 FETCH PRIOR 为对游标的第一次提取操作,则没有行返回并且游标置于第一行之前。 FIRST 返回游标中的第一行并将其作为当前行。 LAST 返回游标中的最后一行并将其作为当前行,动态游标,ABSOLUTE n | nvar 如果 n 或 nvar 为正数,返回从游标头开始的第 n 行并将返回的行变成新的当前行。如果 n 或 nvar 为负数,返回游标尾之前的第 n 行并将返回
48、的行变成新的当前行。如果 n 或 nvar 为 0,则没有行返回。n 必须为整型常量且 nvar 必须为 smallint、tinyint 或 int。 RELATIVE n | nvar 如果 n 或 nvar 为正数,返回当前行之后的第 n 行并将返回的行变成新的当前行。如果 n 或 nvar 为负数,返回当前行之前的第 n 行并将返回的行变成新的当前行。如果 n 或 nvar 为 0,返回当前行。如果对游标的第一次提取操作时将 FETCH RELATIVE 的 n 或 nvar 指定为负数或 0,则没有行返回。n 必须为整型常量且 nvar 必须为 smallint、tinyint 或
49、int。 GLOBAL 指定 cursor_name 指的是全局游标。,游标:提取,cursor_name 要从中进行提取的开放游标的名称。如果同时有以 cursor_name 作为名称的全局和局部游标存在,若指定为 GLOBAL 则 cursor_name 对应于全局游标,未指定 GLOBAL 则对应于局部游标。 cursor_variable_name 游标变量名,引用要进行提取操作的打开的游标。 INTO variable_name,.n 允许将提取操作的列数据放到局部变量中。列表中的各个变量从左到右与游标结果集中的相应列相关联。各变量的数据类型必须与相应的结果列的数据类型匹配或是结果列
50、数据类型所支持的隐性转换。变量的数目必须与游标选择列表中的列的数目一致。,例子三,声明SCROLL游标并使用其它FETCH选项,创建一个 SCROLL 游标,使其通过 LAST、PRIOR、RELATIVE 和 ABSOLUTE 选项支持所有滚动能力。 set nocount on declare sal_cursor scroll cursor for select ename, job, sal from emp order by sal open sal_cursor fetch last from sal_cursor -提取游标结果集最后一行记录 fetch prior from s
51、al_cursor -提取游标结果集当前行的前一行记录 fetch absolute 2 from sal_cursor -提取游标结果集开始位置向后第行记录 fetch relative 3 from sal_cursor -提取游标当前行向后的第三行记录 fetch relative -4 from sal_cursor -提取游标当前行向前的第四行记录 close sal_cursor deallocate sal_cursor go,例子四,创建SCROLL游标,支持分页存取数据的功能(使用数据库Northwind) set nocount on -不显示受影响的行 go create
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 消防设施日常检查要点试题及答案
- 现代语言学研究的关键议题试题及答案
- 掌握2024年CPMM考试策略试题及答案
- 2025年度离婚协议女方孕期权益保护与子女抚养权明确合同模板
- 2025年度特色餐饮品牌加盟店承包协议
- 二零二五年度住宅小区工抵房车位出售与回购合同
- 二零二五年度农村安置房预售许可证及销售合同
- 二零二五年度温泉游泳池租赁与康养服务合同
- 二零二五年度村委会林地承包与林业生态补偿机制合同
- 二零二五年度叉车租赁与物流优化方案服务协议
- 自我管理能力试题及答案
- 邯郸2025年河北邯郸市春季博硕人才引进1438人笔试历年参考题库附带答案详解
- GB/T 25229-2024粮油储藏粮仓气密性要求
- 三次函数的图像和性质用
- 纸板线设备基础知识培训53
- 2022年四川省成都市郫都区嘉祥外国语学校八年级下学期期末语文试卷
- 卓越领导力训练
- 注塑成型试题-及答案
- 众智smartgenHAT600系列双电源自动切换控制器说明书
- 湖南省恶性肿瘤门诊放化疗定点医疗机构申请表
- 个体诊所药品清单
评论
0/150
提交评论