在Sql Server存储过程中使用Cursor(游标)操作记录

在Sql Server存储过程中使用Cursor(游标)操作记录
在Sql Server存储过程中使用Cursor(游标)操作记录

1.为何使用游标:

使用游标(cursor)的一个主要的原因就是把集合操作转换成单个记录处理方式。用SQL语言从数据库中检索数据后,结果放在内存的一块区域中,且结果往往是一个含有多个记录的集合。游标机制允许用户在SQL server内逐行地访问这些记录,按照用户自己的意愿来显示和处理这些记录。

2.如何使用游标:

一般地,使用游标都遵循下列的常规步骤:

(1) 声明游标。把游标与T-SQL语句的结果集联系起来。

(2)打开游标。

(3)使用游标操作数据。

(4)关闭游标。

2.1.声明游标

DECLARE CURSOR语句SQL-92标准语法格式:

DECLARE游标名[ INSENSITIVE ] [ SCROLL ] CURSOR

FOR sql-statement

Eg:

Declare MycrsrVar Cursor

FOR Select * FROM tbMyData

2.2打开游标

OPEN MycrsrVar

当游标被打开时,行指针将指向该游标集第1行之前,如果要读取游标集中的第1行数据,必须移动行指针使其指向第1行。就本例而言,可以使用下列操作读取第1行数据:

FETCH FIRST from E1cursor

或FETCH NEXT from E1cursor

2.3 使用游标操作数据

下面的示例用@@FETCH_STATUS控制在一个WHILE循环中的游标活动

DECLARE E1cursor cursor

FOR SELECT * FROM c_example

OPEN E1cursor

FETCH NEXT from E1cursor

WHILE @@FETCH_STATUS = 0

BEGIN

FETCH NEXT from E1cursor

END

CLOSE E1cursor

DEALLOCATE E1cursor

2.4 关闭游标

使用CLOSE语句关闭游标

CLOSE { { [ GLOBAL ]游标名} |游标变量名}

使用DEALLOCATE语句删除游标,其语法格式如下:

DEALLOCATE { { [ GLOBAL ]游标名} | @游标变量名

3. FETCH操作的简明语法如下:

FETCH

[ NEXT | PRIOR | FIRST | LAST]

FROM

{游标名| @游标变量名} [ INTO @变量名[,…] ]

参数说明:

NEXT 取下一行的数据,并把下一行作为当前行(递增)。由于打开游标后,行指针是指向该游标第1行之前,所以第一次执行FETCH NEXT操作将取得游标集中的第1行数据。NEXT为默认的游标提取选项。

INTO @变量名[,…] 把提取操作的列数据放到局部变量中。列表中的各个变量从左到右与游标结果集中的相应列相关联。各变量的数据类型必须与相应的结果列的数据类型匹配或是结果列数据类型所支持的隐性转换。变量的数目必须与游标选择列表中的列的数目一致。

--------------------------------------------------------------------------------------------------------------------------------

每执行一个FETCH操作之后,通常都要查看一下全局变量@@FETCH_STATUS中的状态值,以此判断FETCH操作是否成功。该变量有三种状态值:

· 0 表示成功执行FETCH语句。

· -1 表示FETCH语句失败,例如移动行指针使其超出了结果集。

· -2 表示被提取的行不存在。

由于@@FETCH_STATU是全局变量,在一个连接上的所有游标都可能影响该变量的值。因此,在执行一条FETCH语句后,必须在对另一游标执行另一FETCH 语句之前测试该变量的值才能作出正确的判断。

下例显示如何嵌套游标以生成复杂的报表。为每个作者声明内部游标。

SET NOCOUNT ON

DECLARE @au_id varchar(11), @au_fname varchar(20), @au_lname

varchar(40),

@message varchar(80), @title varchar(80)

PRINT "-------- Utah Authors report --------"

DECLARE authors_cursor CURSOR FOR

SELECT au_id, au_fname, au_lname

FROM authors

WHERE state = "UT"

ORDER BY au_id

OPEN authors_cursor

FETCH NEXT FROM authors_cursor

INTO @au_id, @au_fname, @au_lname

WHILE @@FETCH_STATUS = 0

BEGIN

PRINT " "

SELECT @message = "----- Books by Author: " +

@au_fname + " " + @au_lname

PRINT @message

-- Declare an inner cursor based

-- on au_id from the outer cursor.

DECLARE titles_cursor CURSOR FOR

SELECT t.title

FROM titleauthor ta, titles t

WHERE ta.title_id = t.title_id AND

ta.au_id = @au_id -- Variable value from the outer cursor

OPEN titles_cursor

FETCH NEXT FROM titles_cursor INTO @title

IF @@FETCH_STATUS <> 0

PRINT " <>"

WHILE @@FETCH_STATUS = 0

BEGIN

SELECT @message = " " + @title

PRINT @message

FETCH NEXT FROM titles_cursor INTO @title

END

CLOSE titles_cursor

DEALLOCATE titles_cursor

-- Get the next author.

FETCH NEXT FROM authors_cursor

INTO @au_id, @au_fname, @au_lname

END

CLOSE authors_cursor

DEALLOCATE authors_cursor

GO

2 游标使用方法:公司行政考评数据的处理

CREATE PROCEDURE dbo.Toltal_jixiao

@firstdata datetime,

@enddata datetime,

@errorMes varchar(100) output

AS

update Staff_Table set YjxkpCount=40 where not exists (select * from JiXiaoKaoHe_Score where suoshubumen=Staff_Table.Ybumen and kaoheren=Staff_Table.Yname

and kaoheRiQi=@firstdata

a nd zhiwu='员工' )

and yuefen=@firstdata and Yzhiwu='员工'

update Staff_Table set YjxkpCount=50 where not exists (select * from JiXiaoKaoHe_Score where suoshubumen=Staff_Table.Ybumen and

k aoheren=Staff_Table.Yname and

k aoheRiQi=@firstdata

a nd zhiwu<>'员工' )

and yuefen=@firstdata and Yzhiwu<>'员工'

--==================================================================== ==========================================

update Staff_Table set YjxkpCount=40-ok.zf from

(select p.kaoheID,

(p.cdzt+p.ybyr+p.kq+p.gztd+p.qjia+p.hjws+p.jianzh+p.tdhz+p.baomi+p.gzzhze+p.caiwu+p.shhzr en+p.work_score) zf from

(select kaoheID,sum(cdzt_score) as cdzt,

sum(ybyr_score) as ybyr,

sum(kq_score) as kq,

sum(gztd_score) as gztd,

sum(qjia_score) as qjia,

sum(hjws_score) as hjws,

sum(jianzh_score)as jianzh,

sum(tdhz_score) as tdhz,

sum(baomi_score) as baomi,

sum(gzzhze_score) as gzzhze,

sum(caiwu_score) as caiwu,

sum(shhzren_score) as shhzren,

sum(work_score) as work_score

from dbo.JiXiaoKaoHe_Score where kaoheRiQi =@firstdata group by kaoheID) p

) ok

where Staff_Table.id=ok.kaoheID and Yzhiwu='员工'

update Staff_Table set YjxkpCount=50-ok.zf from

(select p.kaoheID,

(p.cdzt+p.ybyr+p.kq+p.gztd+p.qjia+p.hjws+p.jianzh+p.tdhz+p.baomi+p.gzzhze+p.caiwu+p.shhzr en+p.work_score) zf from

(select kaoheID,sum(cdzt_score) as cdzt,

sum(ybyr_score) as ybyr,

sum(kq_score) as kq,

sum(gztd_score) as gztd,

sum(qjia_score) as qjia,

sum(hjws_score) as hjws,

sum(jianzh_score)as jianzh,

sum(tdhz_score) as tdhz,

sum(baomi_score) as baomi,

sum(gzzhze_score) as gzzhze,

sum(caiwu_score) as caiwu,

sum(shhzren_score) as shhzren,

sum(work_score) as work_score

from dbo.JiXiaoKaoHe_Score where kaoheRiQi =@firstdata group by kaoheID) p

) ok

where Staff_Table.id=ok.kaoheID and Yzhiwu<>'员工'

update Staff_Table set YjxkpCount=cast(YjxkpCount as

decimal(18,1)) where yuefen=@firstdata

--循环获取迟到早退次数

====================================================================== =========================================================

declare @i int

declare @id1 int

declare cur cursor for

select kaoheID, count(cdzt_score) from JiXiaoKaoHe_Score where kaoheRiQi=@firstdata and cdzt_score<>'' and zhiwu='员工' group by kaoheID

open cur

fetch next from cur into @id1,@i

while @@fetch_status =0

begin

select @id1,@i

-- 统计员工绩效行政考评数据

if @i<6 and @i>2 --3次得

begin

update Staff_Table set YjxkpCount=20 where id=@id1

update Staff_Table set YjxkpCount=20-(select

sum(ybyr_score)+sum(kq_score)+sum(gztd_score)+sum(qjia_score)+sum(hjws_score)+sum(jianz h_score)+sum(tdhz_score)+sum(baomi_score)+sum(gzzhze_score)+

sum(caiwu_score)+sum(shhzren_score)+sum(work_score)

from JiXiaoKaoHe_Score

where kaoheRiQi=@firstdata and zhiwu='员工' and kaoheID=@id1 group by

kaoheID) where id=@id1

--处理小数点问题

update Staff_Table set YjxkpCount=cast(YjxkpCount as

decimal(18,1)) where yuefen=@firstdata

end else if @i>5 --6次的

begin

--1、统计迟到早退次数

update Staff_Table set YjxkpCount=0 where id=@id1

end

fetch next from cur into @id1,@i

end

close cur --关闭游标

deallocate cur

--==================================================================== ====================================================================== =================

declare @i2 int

declare @id2 int

declare cur cursor for

select kaoheID,count(cdzt_score) from JiXiaoKaoHe_Score where kaoheRiQi=@firstdata and cdzt_score<>'' and zhiwu<>'员工' group by kaoheID

open cur

fetch next from cur into @id2, @i2

while @@fetch_status =0

begin

select @id2, @i2

-- 统计管理层绩效行政考评数据

if @i2<6 and @i2>2 --3次得

begin

--1、统计迟到早退次数

update Staff_Table set YjxkpCount=25 where id=@id2

update Staff_Table set YjxkpCount=25-(select

sum(ybyr_score)+sum(kq_score)+sum(gztd_score)+sum(qjia_score)+sum(hjws_score)+sum(jianz h_score)+sum(tdhz_score)+sum(baomi_score)+sum(gzzhze_score)+

sum(caiwu_score)+sum(shhzren_score)+sum(work_score)

from JiXiaoKaoHe_Score

where kaoheRiQi=@firstdata and zhiwu<>'员工' and kaoheID=@id2 group by

kaoheID) where id=@id2

update Staff_Table set YjxkpCount=cast(YjxkpCount as

decimal(18,1)) where yuefen=@firstdata

end else if @i2>5 --6次的

begin

--1、统计迟到早退次数

update Staff_Table set YjxkpCount=0 where id=@id2

end

fetch next from cur into @id2, @i2

end

close cur

deallocate cur

--计算总的分值

update Staff_Table set YzCount = YjxkpCount+YjxhpCount+YzgkpCount where yuefen=

@firstdata

--执行成功

gSuccess:

set @errorMes = ''

return 0

gFail:

if @errorMes =''

set @errorMes = '统计时异常错误'

return -200

GO

SET QUOTED_IDENTIFIER OFF

GO

SET ANSI_NULLS ON

GO

游标与存储过程

实验5 游标与存储过程 1、实验目的 1. 学习实践游标与存储过程 2. 学习实践PL/SQL编程 2、实验原理 1. PL/SQL编程 2. 游标与存储过程 3、实验器材 1. 安装了Oracle,或者MySQL的计算机 4、实验内容 3. 创建表 Code Name Amt 01服装900 0101男装300 010101西装100 010102休闲装200 0102女装390 010201套装120 010202职业装130 010203休闲装140 0103童装210 02电器290 0201进口140 0202国产150 03日用品300 2.编写Oracle的存储过程,实现层次结构的逐级求和。

3.应用sql*plus,编写PL/SQL调用步骤2编写的存储过程。 五、实验报告要求 请将相应SQL语句写在实验报告上 1、 create table example(code number(10),name varchar2(20),amt number(10)); 2、 insert into example values(01,'服装',900); 3、 insert into example values(0101,'男装',300); 4、 insert into example values(010101,'西装',100); 5、 insert into example values(010102,'休闲装',200); 6、 insert into example values(0102,'女装',390); 7、 insert into example values(010201,'套装',120); 8、 insert into example values(010202,'职业装',130); 9、 insert into example values(010203,'休闲装',140); 10、 insert into example values(0103,'童装',210); 11、 insert into example values(02,'电器',290);、 12、 insert into example values(0201,'进口',140); select * from example; CODE NAME AMT --------- -------------------- ---------- 1 服装 900 101 男装 300 10101 西装 100 10102 休闲装 200 102 女装 390 10201 套装 120 10202 职业装 130 10203 休闲装 140

在Sql Server存储过程中使用Cursor(游标)操作记录

1.为何使用游标: 使用游标(cursor)的一个主要的原因就是把集合操作转换成单个记录处理方式。用SQL语言从数据库中检索数据后,结果放在内存的一块区域中,且结果往往是一个含有多个记录的集合。游标机制允许用户在SQL server内逐行地访问这些记录,按照用户自己的意愿来显示和处理这些记录。 2.如何使用游标: 一般地,使用游标都遵循下列的常规步骤: (1) 声明游标。把游标与T-SQL语句的结果集联系起来。 (2)打开游标。 (3)使用游标操作数据。 (4)关闭游标。 2.1.声明游标 DECLARE CURSOR语句SQL-92标准语法格式: DECLARE游标名[ INSENSITIVE ] [ SCROLL ] CURSOR FOR sql-statement Eg: Declare MycrsrVar Cursor FOR Select * FROM tbMyData 2.2打开游标 OPEN MycrsrVar 当游标被打开时,行指针将指向该游标集第1行之前,如果要读取游标集中的第1行数据,必须移动行指针使其指向第1行。就本例而言,可以使用下列操作读取第1行数据: FETCH FIRST from E1cursor 或FETCH NEXT from E1cursor 2.3 使用游标操作数据 下面的示例用@@FETCH_STATUS控制在一个WHILE循环中的游标活动 DECLARE E1cursor cursor FOR SELECT * FROM c_example OPEN E1cursor FETCH NEXT from E1cursor WHILE @@FETCH_STATUS = 0 BEGIN FETCH NEXT from E1cursor END CLOSE E1cursor DEALLOCATE E1cursor 2.4 关闭游标 使用CLOSE语句关闭游标 CLOSE { { [ GLOBAL ]游标名} |游标变量名} 使用DEALLOCATE语句删除游标,其语法格式如下: DEALLOCATE { { [ GLOBAL ]游标名} | @游标变量名

SQLServer存储过程返回值总结.

SQLServer 存储过程返回值总结 1. 存储过程没有返回值的情况 (即存储过程语句中没有 return 之类的语句用方法 int count = ExecuteNonQuery(..执行存储过程其返回值只有两种情况 (1假如通过查询分析器执行该存储过程,在显示栏中假如有影响的行数,则影响几行 count 就是几 (2假如通过查询分析器执行该存储过程, 在显示栏中假如显示 ' 命令已成功完成。 ' 则 count = -1;在显示栏中假如有查询结果,则 count = -1 总结:A.ExecuteNonQuery(该方法只返回影响的行数,假如没有影响行数,则该方法的返回值只能是 -1,不会为 0。 B.不论 ExecuteNonQuery(方法是按照 CommandType.StoredProcedure 或者 CommandType.Text 执行, 其效果和 A 一样。 --------------------------------------------------------------------------------------------------------------------------------------------------- 2. 获得存储过程的返回值 --通过查询分析器获得 (1不带任何参数的存储过程 (存储过程语句中含有 return ---创建存储过程 CREATE PROCEDURE testReturn AS return 145 GO ---执行存储过程

DECLARE @RC int exec @RC=testReturn select @RC ---说明 查询结果为 145 (2带输入参数的存储过程 (存储过程语句中含有 return ---创建存储过程 create procedure sp_add_table1 @in_name varchar(100, @in_addr varchar(100, @in_tel varchar(100 as if(@in_name = '' or @in_name is null return 1 else begin insert into table1(name,addr,tel values(@in_name,@in_addr,@in_tel return 0

ex11游标与存储过程答案

实验十一游标与存储过程 (1)创建游标,逐行显示表Customer.的记录,并用WHILE结构来测试@@Fetch_Status的返回值。输出格式如下: '客户编号'+'-----'+'客户名称'+'----'+'客户地址'+'-----'+'客户电话 '+'------'+'客户邮编'+'------' DECLARE cur_cust SCROLL cursor FOR SELECT* FROM customer DECLARE @p_CustId char(5) DECLARE @p_CustName char(20) DECLARE @p_address char(40) DECLARE @p_Tel char(10) DECLARE @p_Zip char(6) DECLARE @p_All char(100) SELECT @p_All='客户编号'+'------'+'客户名称'+'------'+'客户地址 '+'-------------------------------------'+'客户电话'+'-------'+'客户邮 编'+'------' PRINT @p_All OPEN cur_cust FETCH cur_cust into @p_CustId,@p_CustName,@p_address,@p_Tel,@p_Zip WHILE(@@fetch_status<>-1) BEGIN SELECT @p_All=@p_CustId+' '+@p_CustName+@p_address+@p_Tel+' '+@p_Zip print @p_All FETCH cur_cust into @p_CustId,@p_CustName,@p_address,@p_Tel,@p_Zip END PRINT'客户数目: '+CONVERT(char(5),@@CURSOR_ROWS) CLOSE cur_cust DEALLOCATE cur_cust

实验16 游标、存储过程和函数参考答案

实验十六游标、存储过程和函数 一、目的与要求 1.了解游标的概念和工作原理; 2.了解存储过程的分类和使用方法; 3.了解触发器的概念; 4.学习编写和执行自定义过程; 5.学习编写和执行自定义函数; 6.学习创建和使用触发器。 二、实验准备 1.首先要了解游标是映射在结果集中一行数据上的位置实体,有了游标,用户就可以访问结果集中的任意一行数据了。将游标放置到某行后,即可对该行数据进行操作,最常见的操作是提取当前行数据。 2.使用显式游标的步骤: (1)说明游标。 (2)打开游标。 (3)读取数据。 (4)关闭游标。 3.了解PL/SQL包括3种存储过程,即过程、函数和程序包。 4.了解触发器是一种特殊的存储过程,当指定表中的数据发生变化时自动运行。 三、实验内容 1.练习书上的例子10.1—10.24。 2.以上机实验经常用到的数据库LIB为例,编写过程P_ResetPrice,此过程的功能是将表图书中指定书号的单价更改为10.0,调用该过程将书号为’TP311.13/CM3’的单价更改为10.0,将程序写在实验报告中。 create or replace procedure P_ResetPrice (vBno in varchar2) as begin update 图书 set 单价=10.0 where 图书号=vBno; end; execute P_ResetPrice(‘TP311.13/CM3’); 3.编写一函数F_GetBName,该函数的功能是在图书中根据指定的书号,返回该书的书名,并在匿名块中调用函数F_GetBName找出编号为“TP311.132/ZG1”的书名,将程序写在实验报告中。 create function F_GetName (vtno IN 图书.图书号%Type) return 图书.书名%Type

游标卡尺的正确读数方法

游标卡尺是一种常用的量具,具有结构简单、使用方便、精度中等和测量的尺寸范围大等特点,可以用它来测量零件的外径、内径、长度、宽度、厚度、深度和孔距等,应用范围很广。 结构组成 游标卡尺由主尺和副尺(又称游标)组成。主尺与固定卡脚制成一体;副尺与活动卡脚制成一体,并能在主尺上滑动。游标卡尺有、、0.1mm三种测量精度。 读数方法 游标卡尺是利用主尺刻度间距与副尺刻度间距读数的。以13-2图0.02mm游标卡尺为例,主尺的刻度间距为1mm,当两卡脚合并时,主尺上49mm刚好等于副尺上50格,副尺每格长为=0.98mm。主尺与副尺的刻度间相关为1-0398=0.02mm,因此它的测量精度为0.02mm(副尺上直接用数字刻出) 游标卡尺读数分为三个步骤,下面以图13-3所示游标卡尺的某一状态为例进行说明。 1.在主尺上读出副尺零线以左的刻度,该值就是最后读数的整数部分。图示 33mm。 2.副尺上一定有一条与主尺的刻线对齐,在刻尺上读出该刻线距副尺的格 数,将其与刻度间距0.02mm相乘,就得到最后读数的小数部分。图示为 0.24mm。

3.将所得到的整数和小数部分相加,就得到总尺寸为33.24mm。 游标卡尺的使用方法 量具使用得是否合理,不但影响量具本身的精度,且直接影响零件尺寸的测量精度,甚至发生质量事故,对国家造成不必要的损失。所以,我们必须重视量具的正确使用,对测量技术精益求精,务使获得正确的测量结果,确保产品质量。 使用游标卡尺测量零件尺寸时,必须注意下列几点: 1.测量前应把卡尺揩干净,检查卡尺的两个测量面和测量刃口是否平直无 损,把两个量爪紧密贴合时,应无明显的间隙,同时游标和主尺的零位刻线要相互对准。这个过程称为校对游标卡尺的零位。 2.移动尺框时,活动要自如,不应有过松或过紧,更不能有晃动现象。用固 定螺钉固定尺框时,卡尺的读数不应有所改变。在移动尺框时,不要忘记松开固定螺钉,亦不宜过松以免掉了。 3.当测量零件的外尺寸时:卡尺两测量面的联线应垂直于被测量表面,不能 歪斜。测量时,可以轻轻摇动卡尺,放正垂直位置,图2-6所示。否则,量爪若在如图2-6所示的错误位置上,将使测量结果a比实际尺寸b要大; 先把卡尺的活动量爪张开,使量爪能自由地卡进工件,把零件贴靠在固定 量爪上,然后移动尺框,用轻微的压力使活动量爪接触零件。如卡尺带有微动装置,此时可拧紧微动装置上的固定螺钉,再转动调节螺母,使量爪接触零件并读取尺寸。决不可把卡尺的两个量爪调节到接近甚至小于所测尺寸,把卡尺强制的卡到零件上去。这样做会使量爪变形,或使测量面过早磨损,使卡尺失去应有的精度。

SqlServer存储过程基本语法

动态语句基本语法 1 :普通SQL语句可以用exec执行 Select * from tableName exec('select * from tableName') exec sp_executesqlN'select * from tableName' -- 请注意字符串前一定要加N 2:字段名,表名,数据库名之类作为变量时,必须用动态SQL declare @fnamevarchar(20) set @fname = 'FiledName' Select @fname from tableName -- 错误,不会提示错误,但结果为固定值FiledName,并非所要。exec('select ' + @fname + ' from tableName') -- 请注意加号前后的单引号的边上加空格 当然将字符串改成变量的形式也可 declare @fnamevarchar(20) set @fname = 'FiledName' --设置字段名 declare @s varchar(1000) set @s = 'select ' + @fname + ' from tableName' exec(@s) -- 成功 exec sp_executesql @s -- 此句会报错 declare @s Nvarchar(1000) -- 注意此处改为nvarchar(1000) set @s = 'select ' + @fname + ' from tableName' exec(@s) -- 成功 exec sp_executesql @s -- 此句正确 3. 输出参数 declare @numint, @sqlsnvarchar(4000) set @sqls='select count(*) from tableName' exec(@sqls) --如何将exec执行结果放入变量中? declare @numint, @sqlsnvarchar(4000) set @sqls='select @a=count(*) from tableName ' execsp_executesql @sqls,N'@aint output',@num output select @num 1 :普通SQL语句可以用Exec执行例: Select * from tableName Exec('select * from tableName')

游标卡尺的正确使用方法

机械式游标卡尺的使用方法 制作人:江老师 1、机械游标卡尺的简介 游标卡尺是精密的长度测量仪器,常见的机械游标卡尺如下图所示。它的量程为0~110mm,分 度值为0.1mm,由内测量爪、外测量爪、紧固螺钉、微调装置、主尺、游标尺、深度尺组成。 0~200mm以下规格的卡尺具有测量外径、内径、深度三种功能:

2、游标卡尺的零位校准: 步骤一:使用前,松开尺框上坚固螺钉,将尺框平稳拉开,用布将测量面、导向面擦干净; 步骤二:检查“零”位:轻推尺框,使卡尺两个量爪测量面合并,观察游标“零”刻线与尺身“零” 刻线应对齐,游标尾刻线与尺身相应刻线应对齐。否则,应送计量室或有关部门调整。 3、游标卡尺的测量方法:(外径) 步骤一:将被测物擦干净,使用时轻拿轻放; 步骤二:松开千分尺的固紧镙钉,校准零位,向后移动外测量爪,使两个外测量爪之间距离略

大于被测物体; 步骤三:一只手拿住游标卡尺的尺架,将待测物置于两个外测量爪之间,另一手向前推动活动外 测量尺,至活动外测量尺与被测物接触为止。 步骤四:读数。 注意:1)测量内孔尺寸时,量爪应在孔的直径方向上测量。 2)测量深度尺寸时,应使深度尺杆与被测工件底面相垂直。 4、游标卡尺的读数: 游标卡尺的读数主要分为三步: 1)看清楚游标卡尺的分度。10分度的精度是0.1mm,20分度的精度是0.05mm,50分度的精度 是0.02mm; 2)为了避免出错,要用毫米而不是厘米做单位; 3)看游标卡尺的零刻度线与主尺的哪条刻度线对准,或比它稍微偏右一点,以此读出毫米的整 数值; 4)再看与主尺刻度线重合的那条游标刻度线的数值n,则小数部分是nX精度,两者相加就是测量值; 深度测量 深度测量深度测量 深度测量 3 / 3 机械式游标卡尺的使用方法 机械式游标卡尺的使用方法机械式游标卡尺的使用方法 机械式游标卡尺的使用方法 5)游标卡尺不需要估读。

实验九 游标与存储过程

实验九游标与存储过程 1 实验目的与要求 (1) 掌握游标的定义和使用方法。 (2) 掌握存储过程的定义、执行和调用方法。 (3) 掌握游标和存储过程的综合应用方法。 2 实验内容 请完成以下实验内容: (1)创建游标,逐行显示Customer表的记录,并用WHILE结构来测试 @@Fetch_Status的返回值。输出格式如下: declare @C_no char(9),@C_name char(18),@C_phone char(10), @C_addchar(8),@C_zip char(6) declare @text char(100) declarecus_cur scroll cursor for select* from Customer select @text='=========================Customer 表的记录 =========================' print @text select @text='客户编号'+'-----'+'客户名称'+'----'+'客户住址'+'-----'+'客户电话'+'------'+'邮政编码' print @text select @text='============================================================ ============================' print @text opencus_cur fetchcus_cur into @C_no,@C_name,@C_phone,@C_add,@C_zip while(@@fetch_status=0) begin select @text=@cust_No+' '+@cust_name+' '+@addr+' '+@tel_no+' '+@zip print @text fetchcus_cur into @C_no,@C_name,@C_phone,@C_add,@C_zip end closecus_cur deallocatecus_cur '客户编号'+'-----'+'客户名称'+'----'+'客户住址'+'-----'+'客户电话'+'------'+'邮政编码'

游标卡尺及万能角度尺的使用说明(有图示)

游标卡尺及万能角度尺的使用说明(有图示)

一、游标卡尺的使用说明 利用游标原理对两测量面相对移动分隔的距离进行读数的测量器具。游标卡尺(简称卡尺)。 游标卡尺可以测量产品的内、外尺寸(长度、宽度、厚度、内径和外径),孔距,高度和深度等。 游标卡尺根据其结构可分单面卡尺、双面卡尺、三用卡尺等。 (1)单面卡尺带有内外量爪,可以测量内侧尺寸和外侧尺 寸(图1-1)。 (2)双面卡尺的上量爪为刀口形外量爪,下量爪为内外量爪,可测 内外尺寸(图1-2)。 (3)三用卡尺的内量爪带刀口形 ,用于测量内尺寸;外量爪带平面 和刀口形的测量面,用于测量外尺寸;尺身背面带有深度尺,用于测量深度和高度(图1-3)。 (4)标卡尺读数原理与读数方法 为了掌握游标卡尺的正确使用方法,必须学会准确读数和正确操作。 游标卡尺的读数装置,是由尺身和游标两部分组成,当尺框上的活动测量爪与尺身上的固定测量爪贴合时,尺框上游标的“0”刻线(简称游标零线)与尺身的“0”刻线对齐,此时测量爪之间的距离为零。测量时,需要尺框向右移动到某一位置,这时活动测量爪与固定测量爪之间的距离,就是被测尺寸,见图1-4。假如游标零线与尺身上表示30mm 的刻线正好对齐,则说明被测尺寸是30mm ;如果游标零线在尺身上指示的尺数值比30mm 大一点,应该怎样读数呢?这时,被 刀口内测量爪 尺身尺框紧固螺钉 游标深度尺外测量爪图1-3

测尺寸的整数部分(为30mm),如上所述可从游标零线左边的尺身刻线上读出来 (图中箭头所指刻线),而比1mm小的小数部分则是借助游标读出来的(图中● 图1-4:游标卡尺测量尺寸 游标的小数部分读数方法是首先看游标的哪一条线与尺身刻线对 齐;然后把游标这条线的顺序数乘以游标读数值,就得出游标的读数,即 游标的读数=游标读数值X游标对齐刻线的顺序数 游标卡尺读数时可分三步: A、先读整数——看游标零线的左边,尺身上最靠近的一条刻线的数值,读出被测尺寸的整数部分; B、再读小数——看游标零线的右边,数出游标第几条刻线与尺身的数值刻线对齐,读出被测尺寸的小数部分(即游标读数值乘其对齐刻线的顺序数); C、得出被测尺寸——把上面两次读数的整数部分和小数 部分相加,就是卡尺的所测尺寸。 (1)注意事项 A、清洁量爪测量面。 B、检查各部件的相互作用;如尺框和微动装置移动灵活,紧固螺钉能否起作用。 C、校对零位。使卡尺两量爪紧密贴合,应无明显的光隙,主尺零线与游标尺零线应对齐。 D、测量结束要把卡尺平放,尤其是大尺寸的卡尺更应该注意,否则尺身会弯曲变形。 E、带深度尺的游标卡尺,用完后,要把测量爪合拢,否侧较细的深度尺露在外边,容易变形甚至折断。 F、卡尺使用完毕,要擦净上油,放到卡尺盒内,注意不要锈 蚀或弄脏。

SqlServer存储过程的事务模式编写

SQL Server在存储过程中编写事务处理代码的三种方法 SQL Server中数据库事务处理是相当有用的,鉴于很多SQL初学者编写的事务处理代码存往往存在漏洞,本文我们介绍了三种不同的方法,举例说明了如何在存储过程事务处理中编写正确的代码。希望能够对您有所帮助。 在编写SQL Server 事务相关的存储过程代码时,经常看到下面这样的写法: begin tran update statement 1 ... update statement 2 ... delete statement 3 ... commit tran 这样编写的SQL存在很大隐患。请看下面的例子: create table demo(id int not null) go begin tran insert into demo values (null) insert into demo values (2) commit tran go 执行时会出现一个违反not null 约束的错误信息,但随后又提示(1 row(s) affected)。我们执行select * from demo 后发现insert into demo values(2) 却执行成功了。这是什么原因呢? 原来SQL Server在发生runtime 错误时,默认会rollback引起错误的语句,而继续执行后续语句。 如何避免这样的问题呢? 有三种方法:

1. 在事务语句最前面加上set xact_abort on set xact_abort on begin tran update statement 1 ... update statement 2 ... delete statement 3 ... commit tran go 当xact_abort 选项为on 时,SQL Server在遇到错误时会终止执行并rollback 整个事务。 2. 在每个单独的DML语句执行后,立即判断执行状态,并做相应处理。 begin tran update statement 1 ... if@@error<>0 begin rollback tran goto labend end delete statement 2 ... if@@error<>0 begin rollback tran goto labend end commit tran labend: go 3. 在SQL Server 2005中,可利用try...catch 异常处理机制。

SQL游标嵌套存储过程

--测试数据 create table tmp1 ( ID int not null, val varchar(10), constraint PK_tmp1 primary key (ID) ); create table tmp2 ( ID int not null, vals varchar(100), constraint PK_tmp2 primary key (ID) ); insert into tmp1(id, val) values (1, 'test'); insert into tmp1(id, val) values (2, 'test2'); insert into tmp1(id, val) values (3, 'test3'); insert into tmp1(id, val) values (4, 'test4'); insert into tmp1(id, val) values (5, 'test5'); insert into tmp2(id, vals) values (1, '1,2'); insert into tmp2(id, vals) values (2, '1,3'); insert into tmp2(id, vals) values (3, '2,5'); insert into tmp2(id, vals) values (4, '1,2,3,4,5'); --存储过程 drop procedure proc_tmp_1 go CREATE PROCEDURE proc_tmp_1 AS begin declare @vals varchar(500) declare @id int declare @vals2 varchar(1000) declare @command varchar(1000) declare @vals3 varchar(1000) declare @cmd varchar(1000) declare cursor_tmp_1 cursor for SELECT id, vals FROM tmp2 open cursor_tmp_1 fetch next from cursor_tmp_1 into @id, @vals while @@fetch_status = 0 begin set @vals3 = '' set@cmd = 'declare cursor_tmp_2 cursor for select val from tmp1 where id in (' + @vals + ')' EXEC (@cmd) open cursor_tmp_2 fetch next from cursor_tmp_2 into @vals2 while @@fetch_status = 0 begin if (@vals3 <> '') begin set @vals3 = @vals3 + ',' end SET @vals3 = @vals3 + @vals2

深度游标卡尺使用方法

深度游标卡尺使用方法

深度游标卡尺 深度游标卡尺用于测量凹槽或孔的深度、梯形工件的梯层高度、长度等尺寸,平常被简称为“深度尺”。是一种用游标读数的深度量尺。 深度游标卡尺使用注意事项 深度游标卡尺是比较精密的量具,使用是否合理,不但影响深度游标卡尺本身的精度和使用寿命,而且对测量结果的准确性,也有直接影响。必须正确使用深度游标卡尺。 1.使用前,认真学习并熟练掌握深度游标卡尺的测量、读数方法。 2.搞清楚所用深度游标卡尺的量程、精度是否符合被测零件的要求。 3.使用前,检查深度游标卡尺应完整无任何损伤,移动尺框3时,活动要自如 不应有过松或过紧,更不能有晃动现象。 4.使用前,用纱布将深度游标卡尺擦拭干净,检查尺身4和游标5的刻线是否 清晰,尺身有无弯曲变形、锈蚀等现象。校验零位、检查各部分作用是否正常。 5.使用深度游标卡尺时,要轻拿轻放,不得碰撞或跌落地下。使用时不要用来 测量粗糙的物体,以免过早损坏测量面。 6.移动卡尺的尺框和微动装置时,不要忘记松开紧固螺钉4;但也不要松得过 量,以免螺钉脱落丢失。 7.测量前,应将被测量表面擦干净,以免灰尘、杂质磨损量具。 8.卡尺的测量基座和尺身端面应垂直于被测表面并贴合紧密,不得歪斜,否则 会造成测量结果不准。 9.应在足够的光线下读数,两眼的视线与卡尺的刻线表面垂直,以减小读数误 差。 10.在机床上测量零件时,要等零件完全停稳后进行,否则不但使量具的测量面 过早磨损而失去精度,且会造成事故。 11.测量沟槽深度或当其他基准面是曲线时,测量基座的端面必须放在曲线的 最高点上,测量出的深度尺寸才是工件的实际尺寸,否则会出现测量误差。

sql server存储过程详细代码(超赞!)

use jxgl --首先判断有没有已经建立up_getallstudents存储过程,有则先删除 if exists (select name from sysobjects where name='up_getallstudents'and type ='p') drop procedure up_getallstudents --编写存储过程up_getallstudents,用于获取学生表students的所有记录 create procedure up_getallstudents as select*from students --使用execute执行存储过程up_getallstudents exec up_getallstudents --也可写成 execute up_getallstudents --编写一个存储过程up_insertstudent,完成学生表students数据的插入 --1、不带默认值的参数 create procedure up_insertstudent @sid varchar(15),@sname varchar(30),@ssex char(10), @sbirth datetime,@sbirthplace varchar(300) as begin insert into students (stu_id,stu_name,stu_sex,stu_birth,stu_birthplace) values (@sid,@sname,@ssex,@sbirth,@sbirthplace) end exec up_insertstudent'200712110111','肖玉峰','男','1975-02-05','山东省滕州市木石镇' --等同于 exec up_insertstudent @sname='肖玉峰',@sid='200712110111',@ssex='男',@sbirth= '1975-02-05',@sbirthplace='山东省滕州市木石镇' drop procedure up_insertstudent delete students where stu_name='肖玉峰'

SqlServer 使用存储过程 导出为Excel

SqlServer 使用存储过程导出为Excel 一个脱离office组件的可以将语句结果导出到Excel的过程 --1.执行时所连接的服务器决定文件存放在哪个服务器 [sql]view plain copy print? 1.CREATE PROC ExportFile 2. @QuerySql VARCHAR(max) 3. ,@Server VARCHAR(20) 4. ,@User VARCHAR(20) = 'sa' 5. ,@Password VARCHAR(20) 6. ,@FilePath NVARCHAR(100) = 'c:\ExportFile.csv' 7.AS 8.DECLARE @tmp VARCHAR(50) = '[##Table' + CONVERT(VARCHAR(36),NEWID())+']' 9.BEGIN TRY 10.DECLARE @Sql VARCHAR(max),@DataSource VARCHAR(max)=''; 11.--判断是否为远程服务器 12. IF @Server <> '.'AND @Server <> '127.0.0.1' 13.SET @DataSource = 'OPENDATASOURCE(''SQLOLEDB'',''Data Source='+@Server+';User ID='+@Us er+';Password='+@Password+''').' 14.--将结果集导出到指定的数据库 15.SET @Sql = REPLACE(@QuerySql,' from ',' into '+@tmp+ ' from ' + @DataSource) 16. PRINT @Sql 17.EXEC(@Sql) 18. 19.DECLARE @Columns VARCHAR(max) = '',@Data NVARCHAR(max)='' 20.SELECT @Columns = @Columns + ',''' + name +''''--获取列名(xp_cmdshell导出文件没有列名) 21. ,@Data = @Data + ',Convert(Nvarchar,[' + name +'])'--将结果集所在的字段更新为nvarchar(避 免在列名和数据union的时候类型冲突) 22.FROM tempdb.sys.columns WHERE object_id = OBJECT_ID('tempdb..'+@tmp) 23.SELECT @Data = 'SELECT ' + SUBSTRING(@Data,2,LEN(@Data)) + ' FROM ' + @tmp 24.SELECT @Columns = 'Select ' + SUBSTRING(@Columns,2,LEN(@Columns)) 25.--使用xp_cmdshell的bcp命令将数据导出 26.EXEC sp_configure 'xp_cmdshell',1 27. RECONFIGURE 28.DECLARE @cmd NVARCHAR(4000) = 'bcp "' + @Columns+' Union All ' + @Data+'" queryout ' + @Fi lePath + ' -c' + CASE WHEN RIGHT(@FilePath,4) = '.csv'THEN' -t,'ELSE''END + ' -T' 29. PRINT @cmd 30.exec sys.xp_cmdshell @cmd 31.EXEC sp_configure 'xp_cmdshell',0 32. RECONFIGURE 33.EXEC('DROP TABLE ' + @tmp) 34.END TRY 35.BEGIN CATCH

列出SQLServer数据库中所有的存储过程

列出SQLServer数据库中所有的存储过程 Dim cn As rdoConnection Dim ps As rdoPreparedStatement Dim rs As rdoResultset Dim strConnect As String Dim strSQL As String '利用 DSNless 连接到 pubs 数据库 '改变参数以适合你自己的 SQL Server strConnect = "Driver={SQL Server}; Server=myserver; " & "Database=pubs; Uid=sa; Pwd=" Set cn = rdoEnvironments(0).OpenConnection(dsName:="", Prompt:=rdDriverNoPrompt, ReadOnly:=False, Connect:=strConnect) strSQL = "Select https://www.360docs.net/doc/01413360.html,,https://www.360docs.net/doc/01413360.html,,https://www.360docs.net/doc/01413360.html,,sc.length " & "FROM syscolumns sc,master..systypes st,sysobjects so " & "WHERE sc.id in (select id from sysobjects where type ='P')" & " AND so.type ='P' " & "AND sc.id = so.id " & "AND sc.type = st.type " & "AND sc.type <> 39" Set ps = cn.CreatePreparedStatement("MyPs", strSQL) Set rs = ps.OpenResultset(rdOpenStatic) list1.AddItem "SP Name,Param Name,Data Type,Length" While Not rs.EOF list1.AddItem rs(0) & " , " & rs(1) & " , " & rs(2) & " , " & rs(3) rs.MoveNext Wend rs.Close Set rs = Nothing cn.Close Set cn = Nothing 【

存储过程和游标

我们在进行pl/sql编程时打交道最多的就是存储过程了。存储过程的结构是非常的简单的,我们在这里除了学习存储过程的基本结构外,还会学习编写存储过程时相关的一些实用的知识。如:游标的处理,异常的处理,集合的选择等等 1.存储过程结构 1.1 第一个存储过程 Java代码 1.create or replace procedure proc1( 2. p_para1 varchar2, 3. p_para2 out varchar2, 4. p_para3 in out varchar2 5.)as 6. v_name varchar2(20); 7.begin 8. v_name := '三丰'; 9. p_para3 := v_name; 10. dbms_output.put_line('p_para3:'||p_para3); 11.end; 上面就是一个最简单的存储过程。一个存储过程大体分为这么几个部分: 创建语句:create or replace procedure 存储过程名 如果没有or replace语句,则仅仅是新建一个存储过程。如果系统存在该存储过程,则会报错。Create or replace procedure 如果系统中没有此存储过程就新建一个,如果系统中有此存储过程则把原来删除掉,重新创建一个存储过程。 存储过程名定义:包括存储过程名和参数列表。参数名和参数类型。参数名不能重复,参数传递方式:IN, OUT, IN OUT IN 表示输入参数,按值传递方式。 OUT 表示输出参数,可以理解为按引用传递方式。可以作为存储过程的输出结果,供外部调用者使用。 IN OUT 即可作输入参数,也可作输出参数。 参数的数据类型只需要指明类型名即可,不需要指定宽度。 参数的宽度由外部调用者决定。 过程可以有参数,也可以没有参数 变量声明块:紧跟着的as (is )关键字,可以理解为pl/sql的declare关键字,用于声明变量。 变量声明块用于声明该存储过程需要用到的变量,它的作用域为该存储过程。另外这里声明的变量必须指定宽度。遵循PL/SQL的变量声明规。 过程语句块:从begin 关键字开始为过程的语句块。存储过程的具体逻辑在这里来实现。 异常处理块:关键字为exception ,为处理语句产生的异常。该部分为可选 结束块:由end关键字结果。 1.2 存储过程的参数传递方式 存储过程的参数传递有三种方式:IN,OUT,IN OUT . IN 按值传递,并且它不允许在存储过程中被重新赋值。如果存储过程的参数没有指定存参数传递类型,默认为IN

Oracle存储过程学习_游标CURSOR使用

游标CURSOR的使用学习 游标的类型: 1,隐式游标:在 PL/SQL 程序中执行DML SQL 语句时自动创建隐 式游标,名字固定叫sql。 2,显式游标:显式游标用于处理返回多行的查询。 3,REF 游标:REF 游标用于处理运行时才能确定的动态 SQL 查询 的结果 一、隐式游标 在PL/SQL中使用DML语句时自动创建隐式游标 q隐式游标自动声明、打开和关闭,其名为 SQL q通过检查隐式游标的属性可以获得最近执行的DML 语句的信息q隐式游标的属性有: q%FOUND – SQL 语句影响了一行或多行时为 TRUE q%NOTFOUND – SQL 语句没有影响任何行时为TRUE q%ROWCOUNT – SQL 语句影响的行数 q%ISOPEN - 游标是否打开,始终为FALSE begin update student s set s.sage = s.sage + 10; if sql %FOUND then dbms_output.put_line('这次更新了' || sql% rowcount); else dbms_output.put_line('一行也没有更新'); end if; end; 在select中有两个中比较常见的异常: 1. NO_DATA_FOUND 2. TOO_MANY_ROWS declare sname1 student.sname%TYPE; begin

select sname into sname1 from student; if sql%found then dbms_output.put_line(sql%rowcount); else dbms_output.put_line('没有找到数据'); end if; exception when too_many_rows then dbms_output.put_line('查找的行记录多于1行'); when no_data_found then dbms_output.put_line('未找到匹配的行'); end; 显式游标: sqlserver与oracle的不同之处在于:最后sqlserver会deallocate 丢弃游标,而oracle只有前面四步:声明游标、打开游标、使用游标读取记录、关闭

相关文档
最新文档