分类: 数据库开发技术
2010-04-16 21:54:21
这两天一直在做自己的毕业设计,好好的练习了下数据库的编程知识,现将自己在编程中遇到的一些数据库编程记录如下,因为涉及到数据库中的数据处理,积累了点关于游标的知识,现将这两天的编程知识归纳如下。
先来看一个游标嵌套的一般程序例子,如下:
declare my_cur1 cursor for
select ...
open my_cur1
fetch next from my_cur1 into @tablestring
while @@FETCH_STATUS = 0
begin ...
declare my_cur2 cursor for
select ...
open my_cur2
fetch next from my_cur2 into @columnstring
while @@FETCH_STATUS = 0
begin
...
fetch next from columns_cur into @columnstring
end
close my_cur2
deallocate my_cur2
fetch next from my_cur1 into @tablestring
end
close my_cur1
deallocate my_cur1
由上可以看到,@@FETCH_STATUS 在程序中使用了两次,它是两个游标共同拥有的,只要其中一个游标被提取了,这个提取成功与否的状态就会保存到@@FETCH_STATUS中,
即它是反映当前游标是否成功返回的标志。
现将自己编程当中用到的一个小的应用贴出如下:
描述:
现有一张维修服务单,其字段如下:
字段名 |
字段名称 |
字段类型 |
约束 |
备注 |
wxfwdbh |
维修服务单编号 |
Char(14) |
|
|
wxjhdbh |
维修计划单编号 |
Char(14) |
|
|
wxfzr |
维修负责人 |
Varchar(10) |
|
|
wxry |
维修人员 |
Varchar(10) |
|
|
wxzt |
维修状态 |
Varchar(10) |
|
审核中,维修处理中,维修异常,维修完成 |
gzbh |
故障编号 |
Char(10) |
|
|
gzbwbh |
故障部位编号 |
Char(10) |
|
|
yybh |
原因编号 |
Char(10) |
|
|
wxksrq |
维修开始日期 |
Datetime |
|
|
wxbjxdbh |
维修备件详单编号 |
Char(10) |
|
有维修备件详单子表 |
bz |
备注 |
text |
|
备注 |
然后,在故障现象表,故障原因表,故障部位表,维修详单表中记录了故障现象编号及故障现象,故障原因编号及故障原因,故障部位编号及故障原因和维修所需要的备件详单编号及备件,及维修服务单与故障现象表,故障原因表,故障部位表,维修详单表是一对多的关系,它们的结构如下:
故障现象表:
字段名 |
字段名称 |
字段类型 |
约束 |
备注 |
gzbh |
故障编号 |
Char(10) |
|
|
gzxxbh |
故障现象编号 |
Char(10) |
|
|
故障原因表
字段名 |
字段名称 |
字段类型 |
约束 |
备注 |
yybh |
原因编号 |
Char(10) |
|
|
gzyybh |
故障原因编号 |
Char(10) |
|
|
其余两个表故障部位表,维修详单表省略
还有就是基础数据信息表:
基础故障现象信息表:
字段名 |
字段名称 |
字段类型 |
约束 |
备注 |
gzxxbh |
故障现象编号 |
Char(10) |
主键 |
|
gzxxmc |
故障现象名称 |
Varchar(50) |
|
|
基础故障原因信息表:
字段名 |
字段名称 |
字段类型 |
约束 |
备注 |
gzyybh |
故障原因编号 |
Char(10) |
主键 |
|
gzyymc |
故障原因名称 |
Varchar(50) |
|
|
目前的任务是,根据维修服务单,将故障现象,故障原因,故障部位,均以名称显示出来,并存储到另一张表中。
格式如下:
维修服务单编号 故障现象名称 故障部位名称 故障原因信息
WXFW2010022301 排烟颜色不正常,发动困难,换挡有异声
油箱,离合器 化油太稀,化油太稀
这里的名称,由于是数据库中一条一条记录读出,需要组合而成,所以用到了有关游标的知识,故将此应用的游标程序贴出如下:(主要是存储过程)
create proc pro_gzyyfx
as
begin
declare @wxfwdbh char(14)
declare @gzbh char(10)
declare @gzxxbh char(10)
declare @gzxx varchar(100)
declare @gzbwbh char(10)
declare @gzbw varchar(100)
declare @gzyybh char(10)
declare @gzyy varchar(100)
declare @bwbh char(6)
truncate table
WXGL.WXGL_gzyyfx
--声明游标my_cursor1读取wxfwdbh信息
declare
my_cursor1 cursor scroll dynamic
for select wxfwdbh from
WXGL.WXGL_wxfwd_table
open my_cursor1
fetch next from my_cursor1 into
@wxfwdbh
while(@@fetch_status = 0)
begin
set @gzxx=''
set @gzbw=''
set @gzyy=''
--声明游标my_cursor2读取故障现象
declare my_cursor2 cursor scroll dynamic
for (select C.gzxxbh from WXGL.WXGL_wxfwd_table A,WXGL.WXGL_gzbh_gzxx_table B,WXGL.WXGL_gzxxxx_table C
where
A.gzbh=B.gzbh and B.gzxxbh=C.gzxxbh and A.wxfwdbh=@wxfwdbh)
open my_cursor2
fetch next from my_cursor2 into @gzxxbh
while(@@fetch_status = 0)
begin
set @gzxx=(@gzxx+(select gzxxmc from
WXGL.WXGL_gzxxxx_table where
gzxxbh=@gzxxbh)+',')
fetch next from my_cursor2 into
@gzxxbh
end
close my_cursor2
deallocate my_cursor2
--声明游标my_cursor3读取故障部位
declare my_cursor3 cursor scroll dynamic
for (select C.bwbh from WXGL.WXGL_wxfwd_table A,WXGL.WXGL_gzbwbh_gzbw_table B,WXGL.WXGL_clbwxx_table C
where
A.gzbwbh=B.gzbwbh and B.bwbh=C.bwbh and A.wxfwdbh=@wxfwdbh)
open my_cursor3
fetch next from my_cursor3 into @bwbh
while(@@fetch_status = 0)
begin
set @gzbw=(@gzbw+(select bwmc from WXGL.WXGL_clbwxx_table where
bwbh=@bwbh)+',')
fetch next from my_cursor3 into
@bwbh
end
close my_cursor3
deallocate my_cursor3
--声明游标my_cursor4读取故障现象
declare my_cursor4 cursor scroll dynamic
for (select C.gzyybh from WXGL.WXGL_wxfwd_table A,WXGL.WXGL_yybh_gzyy_table B,WXGL.WXGL_gzyyxx_table C
where
A.yybh=B.yybh and B.gzyybh=C.gzyybh and A.wxfwdbh=@wxfwdbh)
open my_cursor4
fetch next from my_cursor4 into @gzyybh
while(@@fetch_status = 0)
begin
set @gzyy=(@gzyy+(select gzyymc from
WXGL.WXGL_gzyyxx_table where
gzyybh=@gzyybh)+',')
fetch next from my_cursor4 into
@gzxxbh
end
close my_cursor4
deallocate my_cursor4
insert into WXGL.WXGL_gzyyfx(wxfwdbh,gzxx,gzbw,gzyy)values(@wxfwdbh,@gzxx,@gzbw,@gzyy)
fetch next from my_cursor1 into @wxfwdbh
end
close my_cursor1
deallocate my_cursor1
end
到此为止吧,就写这么多,很基础的,供大家入门参考学习。