多语言展示
当前在线:204今日阅读:113今日分享:31

数据库大全知识

第一节库操作及基本查询/*库操作*//*SQL数据库管理*/create table emp(eid int,ename varchar(10),sal money/*不可给自动增加列赋值*//*列名列表要和值列表匹配*//*字符类型与日期类型加单引号*/insert into emp(sal,ename,eid) values(1234,'rose',1001)/*删除表中数据*/1。drop table emp--最为彻底2。truncate table emp--不带日志,效率较高/*此两种方法不能被外键引用,不可带条件删除*/3。delete from emp where ... delete from表名where条件/*不能删除被引用的数据*//*表重命名*/sp_rename 'emp','newemp'/*列重命名*/sp_rename 'newemp.eid','neweid','COLUMN'/*复制表结构(带数据)*/select * into emp from newemp--自增与NOT NULL可复制,其他约束不/*复制表结构(不带数据)*/select * into emp from newemp where 1>2/*复制部分列*/select clo1,col2,col3 into emp from newemp/*上三种中emp为select自动创建新表*//*查询指定表约束*/sp_helpconstraint emp/*执行指定的SQL指令*/sp_executesql N'select * from emp'/*N表示后面的字符串采用unicode编码体系(无论中英文均一字符双字节)*//*模糊查询like*/select * from emp where eid not like '[0-8][0-8][0-12]'/*中括号内代表‘一’位字符的范围,[0-12]即[0-1]||[0-2]*/select * from emp where ename like 'w_'下划线/*"_"通配符,代表所有字符,就是麻将里的“混”*/select * from emp where ename like 'w%'/*"%"代表任意位的任意字符*/select * from emp where not ename='we'/*not不等于*/select * from emp whereename is null/*is null不是=null!*/select * from emp where ename is not null/*is not null不是not is null*/select * from emp where eidnot in (2002)/*in包含于*/select * from emp where eid between 1001 and 1002/*between在两值之间的范围内取值*/第二节表操作及约束/*表操作*//*创建表*/create table emp(eid int primary key,--主键ename sql_variant,--通用数据类型flag timestamp--时间戳)/*插入列*/alter table emp add esex varchar(10) default 'nan'/*插入数据*/insert into emp(eid,ename) values(1004,'accp')insert into emp(eid,ename) values(1005,getdate())insert into emp(eid,ename) values(1006,3.1415926)/*更新数据*/update emp set ename='app' where eid=1004/*约束*/create table emp(eid int constraint pk_eid primary key,--主键约束ename varchar(10),sal numeric(7,2) constraint ck_sal check (sal>0),--检查约束selfid varchar(18) constraint uq_id unique,--唯一约束idate datetime constraint def_data default getdate()--默认约束)sp_pkeys emp--查看主键sp_help emp--查看约束alter table emp drop CK__emp__sal__78B3EFCA--删除约束alter table emp add constraint pk_id primary key(eid)--增加约束/*外键操作*/create table dept--主表(did int primary key,dname varchar(10),)create table emp(eid int primary key,ename varchar(10),dno int constraint fk_did foreign key references dept(did) on update cascade/*on delete no action无级连更新,删除时外键冲突报错并回滚delete*//*on update no action无级连更新,更新时外键冲突报错并回滚update*//*on delete cascade删除时允许级连更新*//*on update cascade更新时允许级连更新*/)alter table emp addconstraint fk_did foreign key (dno) references dept(did)--增加外键第三节多表查询及聚合函数/*查询实例*/create table com(cid int primary key,cname varchar(10),ctel varchar(20))--公司表create table dept(did int primary key,dname varchar(10),dtel varchar(20),cno int references com(cid))--部门表create table emp(eid int primary key,ename varchar(10),etel varchar(10),dno int references dept(did)) --员工表/*插入数据*/insert into com select 1001,'sun','120'union select 1002,'IBM','130'union select 1003,'top','140'union select 1004,'MS','150'--union集合运算符,批量操作insert into dept select 2001,'财务部','110',1001union select 2002,'行政部','120',1001union select 2003,'组织部','130',1001union select 2004,'人事部','140',1001insert into emp select 3001,'rose','110',2001union select 3002,'jack','120',2002union select 3003,'tom','130',2003union select 3004,'mike','140',2004union select 3005,'wilin','150',2002/*多表连接查询*/select * from dept left outer join emp on emp.dno=dept.did--左外连接,左表的所有数据以及右表的匹配数据,不匹配显示NULLselect * from emp left outer join dept onemp.dno=dept.did left outer join com on dept.cno=com.cid--多表左连接/*右连接*/select * from com right outer join dept on com.cid=dept.cno--右表中的所有数据,左表中的匹配数据,左表中不能和右表匹配的数据‘不显示’,--右表中的数据如果在左表中找不到匹配数据,会在对应左表位置显示为NULL/*内连接*/create table employee(eid int primary key,ename varchar(10),reportto int references employee(eid))insert into employee select 1001,'rose',nullunion select 1002,'will',1001union select 1003,'yao',1001union select 1004,'gigi',1002select * from employee e inner join employee m on m.eid=e.reportto--显示员工与其直接上级的对应关系/*聚合函数*/create table goods(gid int,gname varchar(10),price money)insert into goods select 1002,'accp',3456union select 1002,'bccp',56union select 1003,'cccp',456/*错误事例*/select gid ,avg(price) as avgp from goods/*正确事例*/select gid ,avg(price) as avgp from goods group by gid--单行与聚合不能一起使用,除非一句单行进行分组/*错误事例*/select * from goods where price=max(price)/*正确事例*/select * from goods whereprice=(select max(price) from goods)--聚合函数不能出现在where指令中第四节多维数据集及计算列create table inventory(item varchar(10),color varchar(10),quantity int--库存表)insert into inventory select 'table','blue',124union select 'table','red',223union select 'table','red',211union select 'chair','blue',101union select 'chair','red',210/*group by,order by*/select item,color,sum(quantity) as qu from inventory group by item,color orderby item desc--只有item和color相同的行才能分在一个组中/*with CUBE*/select item,color,sum(quantity) as qu from inventory group by item,color withCUBE order by item desc--CUBE运算符生成的结果集是多维数据集。多维数据集是事实数据的扩展,事实数据即记录个别事件的数据。--扩展建立在用户打算分析的列上。这些列被称为维。多维数据集是一个结果集,其中包含了各维度的所有可能组合的交叉表格。--CUBE运算符在SELECT语句的GROUP BY子句中指定。该语句的选择列表应包含维度列和聚合函数表达式。--GROUP BY应指定维度列和关键字WITH CUBE。结果集将包含维度列中各值的所有可能组合,以及与这些维度值组合相匹配的基础行中的聚合值。/*with ROLLUP*/select item,color,sum(quantity) as qu from inventory group by item,color withROLLUP order by item desc--CUBE和ROLLUP的区别在于:--CUBE生成的结果集显示了所选列中值的所有组合的聚合--ROLLUP生成的结果集显示了所选列中值的某一层次的聚合--ROLLUP层次结构列语句中列的顺序由select中的列名列表顺序决定/*计算列*/create table emp(eid int primary key,joinyear int,--工龄sal money,--年薪allsal as sal*joinyear --总收入=工龄×年薪)--不需要给计算列提供值insert into emp(eid,joinyear,sal) values (1,5,10000)select * from emp/*COMPUTE*/select item,color,quantity from inventory order by quantity COMPUTEsum(quantity),count(item)--此语句有两个结果集是包含选择列表信息的所有明细行--第二个结果集只有一行,其中包含COMPUTE子句中指定的聚合函数的合计--多个聚合函数由逗号分割--COMPUTE语句中order by子句为可选/*COMPUTE by*/select item,color,quantity from inventory order by item COMPUTE sum(quantity)by item--当COMPUTE带有可选的BY子句时,符合select条件的每个组都有两个结果集--每个组的第一个结果集是明细行集,其中包含该组的选择列表信息--每个组的第二个结果集有一行,包含该组的COMPUTE子句中所指定的聚合函数小计--必须先排序,后计算--依据列表与排序依据列表匹配--order by子句必选/*范式*//*1NF*/--去除非依赖性--保证所有的属性都与实体相关/*2NF*/--去除部分依赖性--如果非关键属性只依赖于关键属性的一部分,非关键属性应去除掉--例如有gid,wno,pid为组合键,而pname仅和pid相关,pname为非关键属性--解决方法为将pid与pname分离为另一张表/*3NF*/--去除传递依赖性--传递依赖指的是非关键属性的相互依赖--如满足3NF则一定满足2NF,1NF--如满足2NF则一定满足1NF第五节批处理及case表达式/*批处理定义*//*以一次执行一批命令中的一条命令的方式处理一组命令的过程被称为批处理*/Use Pubs--相当于快捷键alt+uSelect * from authorsUpdate authorsset phone= '890 451-7366'where au_lname= 'White'Go/*go标识批处理结束*//*waitfor*//*WAITFOR { DELAY 'time' | TIME 'time' }DELAY是在完成WAITFOR语句之前等待的时间。完成WAITFOR语句之前等待的时间最多为24小时。TIME关键字后为time_to_execute,它指定WAITFOR语句要等待的时间。*/WAITFORDELAY '00:00:02' SELECTEmployeeID FROM Northwind.dbo.Employees--指定在执行SELECT语句之前等待两秒:USE pubsBEGINWAITFOR TIME '22:00' DBCC CHECKALLOCEND--TIME关键字指定在10 P.M以后对指定数据库pubs进行检查,以确保所有页的分配和使用正确--一组要执行的T-SQL语句可以包含在BEGINEND中,相当于{}/*while循环*/WHILE (SELECT AVG(price) FROM good) < 4000--市场平均价不得超过4000元BEGINUPDATE goodSET price = price * 2--价格增加一倍IF (SELECT MAX(price) FROM good) >3000--商品最高价格不得超过3000BREAKELSECONTINUEEND--市场价分析实例/*CASE(有列名)*/create table goods(gid int primary key,gname varchar(10),price money default 3000)insert into goods values (1001,'mp3',default)insert into goods values (1002,'mp4',default)insert into goods values (1001,'cpu',default)select gid,case gnamewhen 'mp3' then '显示器'else 'hd'endas gname from goods--上面六行仅为一条select语句--CASE与end成对出现--将or显示为oregon--case仅修改显示内容,不修改表中实际内容/*case表达式(无列名)*/select gid ,casewhen gname='mp3' and gid=1001 then '显示器'else gname--上行的列名gname代表无操作endas gname from goods--case表达式与case的主要区别为case表达式可以加条件判断/*update语句中使用case表达式*/UPDATE publishers SET state =CASE WHEN country <> 'USA' THEN '--' ELSE stateEND, city =CASEWHEN pub_id ='9999' THEN'LYON'ELSE cityENDWHERE country <>'USA' OR pub_id ='9999'--上面只有一条语句,不知道使用这样的缩进是把句子结构看清楚了?还是更晕了?/*定义变量*/declare @res int,@a varchar(10)--局部变量用一个@,全局变量用两个@/*变量赋值*/set @res=89set @a='accp'/*打印变量值*/print @res第六节交叉报表及事务/*交叉报表*/create table pivot(yearint,quarter int,amountreal)insert into pivot values (1990, 1, 1.1)insert into pivot values (1990, 2, 1.2)insert into pivot values (1990, 3, 1.3)insert into pivot values (1990, 4, 1.4)insert into pivot values (1991, 1, 2.1)insert into pivot values (1991, 2, 2.2)insert into pivot values (1991, 3, 2.3)insert into pivot values (1991, 4, 2.4)select * from pivot--原始结果集select year,sum(case quarter when 1 then amount else 0 end) as Q1,sum(case quarter when 2 then amount else 0 end) as Q2,sum(case quarter when 3 then amount else 0 end) as Q3,sum(case quarter when 4 then amount else 0 end) as Q4from pivotgroup by year--行列互换后的结果集/*case:如果季度的值为1,则转换为amount列,否则计0,并将次列起别名为Q1sum:求和,若符合条件则对该季度求和,不符合聚合0,为0处不可为null,null将被sum和avg等聚合函数忽略,造成错误结果*//*事务*//*原子性:事务的所有操作在数据库中要么全部正确反映出来,要么全部不反映一致性:事务隔离执行时(即在没有其他事务并发执行的情况下)保持数据库的一致性隔离性:尽管多个事务可以并发执行,但系统保证,对于任何一对事务t1和t2,在t1看来,t2或者在t1开始之前已经停止执行,或者在t1完成之后开始执行这样,每个事务都感觉不到系统中有其他事务在并发的执行持久性:一个事务成功完成后,它对数据库的改变必须是永久的,即使是系统出现故障时也是如此*/begin tran t1--开始事务,t1为事务名create table emp(empid int primary key,ename varchar(20),etel int,reportto int references emp(empid))rollback tran t1--回退,撤销事务的更改insert into emp select 1001,'rose',110,nullunion select 1002,'jack',120,1001union select 1003,'tom',114,1002union select 1004,'mike',118,1002union select 1005,'frank',119,1004commit tran t1--提交事务,事务提交之后将不可回退(持久性)第七节 SQL安全性/*SQL安全性*//*通过企业管理器设置安全性*//*注意!部分版本的SQL默认为只允许windows用户登陆,sa的登陆将无效,解决方法是在企业管理器右击左边控制台目录的服务器图标,选属性/安全性选项卡,将“仅windows”单选钮改选为“SQL server和windows”即可*/--1.控制台/服务器目录/安全性/登录,右击/新建登录----1)名称下输入登录用户名,身份验证下选择“sql身份验证”,输入密码----选择该用户登陆默认数据库及语言----2)单击服务器角色,选择该登录在服务器上的权限,各权限意义如下:------a)system adminstrators------可执行SQL Server安装中的任何操作。------b)security adminstrators------可管理服务器的登录。------c)server adminstrators------可配置服务器范围的设置------d)setup adminstrators------可以管理扩展的存储过程------e)process adminstrators------可以管理运行在SQL Server中的进程------f)disk adminstrators------可以管理磁盘文件------g)database creators------可以创建和更改数据库------h)bulk insert adminstrators------可以执行大容量插入操作----可点击属性查看权限的相关信息----3)单击数据库访问选项卡,选择该登录可访问的数据库及数据库角色----数据库角色:------a)public------public角色------public角色是一个特殊的数据库角色,每个数据库用户都属于它。public角色:------捕获数据库中用户的所有默认权限。------无法将用户、组或角色指派给它,因为默认情况下它们即属于该角色。------含在每个数据库中,包括master、msdb、tempdb、model和所有用户数据库。------无法除去。------b)db_owner------进行所有数据库角色的活动,以及数据库中的其它维护和配置活动。------该角色的权限跨越所有其它固定数据库角色。------c)db_accessadmin------在数据库中添加或删除Windows NT 4.0或Windows 2000组和用户以及SQL Server用户。------d)db_datareader------查看来自数据库中所有用户表的全部数据。------e)db_datawriter------添加、更改或删除来自数据库中所有用户表的数据------f)db_ddladmin------添加、修改或除去数据库中的对象(运行所有DDL)------g)db_securityadmin------管理SQL Server 2000数据库角色的角色和成员,并管理数据库中的语句和对象权限------h)db_backupoperator------有备份数据库的权限------i)db_denydatareader------拒绝选择数据库数据的权限------j)db_denydatawriter------拒绝更改数据库数据的权限--2.数据库/用户/新建用户--通过用户名与登录名进行关联--如果已经将数据库角色设置好,将自动关联与登录名相同的用户名--若修改用户名应先将该用户删除再进行关联--若无关联,该登录用户名将会显示dbo--若该登录的服务器角色为system adminstrators,则user将恒为dbo--用户与登录为1对1的关联关系/*通过查询分析器管理安全性*//*新建登录*/exec sp_addlogin 'lecky','123','sales'--参数1登录名参数2密码参数3默认数据库/*承担服务器角色*/sp_addsrvrolemember 'lecky','sysadmin'--参数1登录名,参数2为固定服务器角色--注意:此处与企业管理器的服务器角色名称不同,为简写,如下:----sysadmin在SQL Server中进行任何活动。该角色的权限跨越所有其它固定服务器角色。----serveradmin配置服务器范围的设置。----setupadmin添加和删除链接服务器,并执行某些系统存储过程(如sp_serveroption)。----securityadmin管理服务器登录。----processadmin管理在SQL Server实例中运行的进程。----dbcreator创建和改变数据库。----diskadmin管理磁盘文件。----bulkadmin执行BULK INSERT语句。/*将已经创建的登录映射为数据库用户,并授予数据库角色*/exec sp_adduser 'lecky','lecky','public'--参数1登录名,参数2用户名,参数3数据库角色第八节高级查询/*子查询*/USE northwindSELECT orderid, customeridFROM orders AS or1WHERE 20 < (SELECT quantity FROM [order details] AS od WHEREor1.orderid = od.orderidANDod.productid= 23)--当子查询的结果唯一的时候,可使用比较运算符--不唯一的时候,不可使用比较,必须使用集合运算符--集合运算符:not in/in--gid in(1001)合法USE pubsSELECT au_lname, au_fname FROM authorsWHERE 100 IN(SELECT royaltyper FROM titleauthorWHERE titleauthor.au_ID = authors.au_id)/*exists*/USE pubsSELECT au_lname, au_fnameFROM authorsWHERE exists (SELECT * FROM publishers WHERE authors.city = publishers.city)--EXISTS用于检查子查询返回的行是否存在--该子查询实际上并不返回任何数据,而是返回TRUE或FALSE/*union*/--Union操作符:将两个或更多个SELECT语句的结果合并为一个结果集。--使用ALL子句表示不删除重复的行。--集合特性——唯一性,无序性--每个union select必须结构相同,列类型,数目,次序,数据类型相同/*distinct*/USE pubsSELECT AVG(DISTINCT price)FROM titlesWHERE type = 'business'--如果使用DISTINCT,那么在计算总和、平均值或计数之前,先消除重复的值。--如果使用DISTINCT关键字,表达式必须只包含列名。而不能包含算术表达式。/*table类型变量*/declare @mtab table(midint,mname varchar(10))insert into @mtabprint '更新之前'select * from @mtabupdate @mtab set mid=1009 where mid=1001print '更新之后'select * from @mtab第九节索引--索引是对数据库表中一个或多个列的值进行排序的结构--索引提供指针以指向存储在表中指定列的数据值,然后根据指定的排序次序排列这些指针/*查询指定的数据库有多少张表*/select object_id('employee')--获得指定database对象的ID,如果该对象不存在,返回NULLselect name from syscolumns whereid=object_id('employee')--返回指定表的字段select name from sysobjects where xtype='U'--返回指定数据库的用户表--xtype表类型,U表示用户表/*索引分类*/--表中各行的物理顺序与键值的逻辑(索引)顺序相同称为聚集索引。表只能包含一个聚集索引--非聚集索引指定表的逻辑顺序。select * from sysindexes where name='lecky'--sysindexes查询指定表的索引--0表示无索引--name为索引名/**主键不允许添加在允许为空的字段**/--创建表的时候,如果指定了主键,那么SQL自动在主键列上面创建聚集索引,--索引的名称和主键约束的名称相同/*sysindexes*/--数据库中的每个索引和表在表中各占一行--该表存储在每个数据库中--表indid字段表示索引ID--1 =聚集索引-->1 =非聚集--255 =具有text或image数据的表条目/*创建索引的指导原则*/--适合创建索引情况:----该列频繁用于进行搜索。----该列用于对数据进行排序。--不适合创建索引情况:----列中仅包含几个不同的值。----表中仅包含几行。/*创建索引*/CREATE [UNIQUE] [CLUSTERED|NONCLUSTERED]INDEX index_nameON table_name(column_name[, column_name]…)--在允许为空的列上创建聚合索引--可录入相同数据,说明聚集索引不一定唯一,二者没有直接关系--默认创建非聚集,不唯一的索引/*查询索引*/select * from sysindexes where name='index_name'/*非聚集索引*/--非聚集索引指定表的逻辑顺序。数据存储在一个位置,索引存储在另一个位置,索引中包含指向数据存储位置的指针。--一个表可以有多个(最多249个)非聚集索引第十节视图/*虚拟表,不保存视图,只保存一个简单的查询语句*//*视图中的数据来源于基表,可以通过视图对基表的数据进行增,删,改查,(在满足一定条件下)*//*表变量*/declare @tab table(tid int primary key,price money check(price>3000),sid int default)--允许加约束--表变量之间不可以有相互引用的关系/*临时表*/--1.局部临时表:--只对当前连接有效,当连接断开的时候临时表消失--局部临时表名称前加#create table #emp(eid int primary key,ename varchar(10),esal money check(esal>300))insert into #emp select 1001,'accp',5678--临时表不可能创建外键,但可以有其他约束--全局临时表--对所有连接有效,创建表的连接断开临时表消失--全局临时表前加两个##、/*首选表变量其次临时表,最后关系表*/--全局临时表不可创建外键,但可以有其他类型的约束/*视图*/create table dept(did int primary key,dname varchar(10))create table emp(eid int primary key,ename varchar(10),did int references dept(did))insert into dept select 1001,'财务部'union select 1002,'人事部'union select 1003,'行政部'union select 1004,'技术部'insert into emp select 2001,'rose',1001union select 2002,'jack',1003union select 2003,'will',1002union select 2004,'gigi',1004--drop table dept/*创建视图*/create view v as select * from emp--v为视图名,as为必须/*查询视图*/select * from v/*通过视图V向基表emp录入数据*/insert into v values(2005,'mikel',1003)/*通过视图向基表更新数据*/update v set ename='helen' where eid=2005/*通过视图删除基表的数据*/delete from v where eid=2005--drop view v/*视图不包含主键列*/create view v as select ename,did from empselect * from v--可以查询,可以删除,可以更新,不可以插入/*当所创建的视图不包含基表所有非空列的时候,不能通过该视图进行数据录入*//*多表视图*//*重定义视图*/alter view vas select did from empcreate view v as select eid,ename,emp.did asedid,dept.did as did,dnamefrom emp,dept where emp.did=dept.did--创建多表连接的时候,视图中的列名必须唯一--如果没有where子句,则结果为两表的笛卡儿积/*视图包含所有的列*/delete from v--不可删除数据,因为修改会影响多个基表insert into v values(11,'aa',1001,1008)--不能录入数据,因为修改会影响到多个基表update v set ename='ee',dname='cc'--更新,影响到一个基表时可以,多个基表则不允许/*视图不包含基表的所有非空列*/--可以查询,不可删除,插入,--更新同上/*where条件*/alter view v as select * from dept where did>1003--定义视图时指定的where条件对查询起作用delete from v where did=1001--对删除起作用update v set dname='aa' where did=1001--对更新起作用insert into vvalues(1001,'dd')--对插入不起作用,但是查询不到第十一节游标--游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制/*游标的作用*/--允许定位到结果集中的特定行。--从结果集的当前位置检索一行或多行数据。--支持对结果集中当前位置的行进行修改/*创建游标*/DECLARE cursor_name [ INSENSITIVE ] [ SCROLL ] CURSOR FOR select_statement [FOR { READ ONLY | UPDATE [ OF column_name [ ,...n ] ] } ]/*cursor_name是所定义的Transact-SQL游标名称。INSENSITIVE定义一个游标,以创建将由该游标使用的数据的临时复本。对游标的所有请求都从tempdb中的该临时表中得到应答;因此,在对该游标进行提取操作时返回的数据中不反映对基表所做的修改,并且该游标不允许修改。使用SQL-92语法时,如果省略INSENSITIVE,(任何用户)对基表提交的删除和更新都反映在后面的提取中。SCROLL指定所有的提取选项(FIRST、LAST、PRIOR、NEXT、RELATIVE、ABSOLUTE)均可用。如果在SQL-92 DECLARE CURSOR中未指定SCROLL,则NEXT是唯一支持的提取选项。如果指定SCROLL,则不能也指定FAST_FORWARD。select_statement是定义游标结果集的标准SELECT语句。在游标声明的select_statement内不允许使用关键字COMPUTE、COMPUTE BY、和INTO。*//*游标操作*/declare cr cursorforselect * fromauthors--定义游标--该游标未指定scroll,只可用nextopen cr--打开游标fetch next from cr--推进游标close cr--关闭游标deallocate cr--删除游标create table emp(eid int primary key,ename varchar(10),sal money)insert into emp select 1001,'rose',1234union select 1002,'jack',2564union select 1003,'will',245union select 1004,'lecky',456--首次推进的结果为第一条/*fetch_status*/--返回被FETCH语句执行的最后游标的状态,而不是任何当前被连接打开的游标的状态。-- 0FETCH语句成功。-- -1FETCH语句失败或此行不在结果集中。(无法fetch的时候)-- -2被提取的行不存在fetch next from crwhile @@fetch_status=0beginfetch next from crend--如不推进,则全局变量的值对于循环是否能够启动没有参考价值--最后一行fetch_status值为0--下一条为-1/*滚动游标*/declare cr cursor scroll for select * from emp--需用scroll关键字open crfetch next from crclose crdeallocate cr
推荐信息