下面是我的一个游标,存储过程的例子。。
create procedure bomDecomposition --创建 存储过程 过程名称
(
@sorderId varchar(20) --输入参数(可以是多个的)
)
as
begin
declare @tasksId int --声明变量 指明类型
declare @wlid nvarchar(30)
declare @userId nvarchar(30)
declare @unitCount int
declare @goodsId nvarchar(30)
declare @departId nvarchar(30)
declare @billCode nvarchar(50)
--声明游标
declare my_cursor cursor
for
select a.WLID,a.USERID,b.UNITCOUNT,b.goodsid,a.DEPARTID,a.billcode
from SALEORDER as a,SALEORDERDETAIL as b
where a.SORDERID=b.SORDERID and a.SORDERID=@sorderId
---查询出多条数据sql语句
begin
open my_cursor ---打开游标
fetch my_cursor into --把查询结果的值赋值到变量中 @wlid,@userId,@unitCount,@goodsId,@departId,@billCode
while(@@fetch_status=0) --while循环
begin
--查询字段放到变量中,用来判断
select @tasksId=TASKSID from PRODUCE_TASKS where SALEORDER_BILLCODE=@billCode and goodsid=@goodsId
if @tasksId is null ---判断是不是null
begin
--向生产任务表中添加数据
insert into PRODUCE_TASKS(WLID,USERID,GOODSID,BOMID,DEPARTID,SALEORDER_BILLCODE)
select @wlid,USERID,GOODSID,BOMID,@departId,@billCode from PRODUCE_BOM_BOM where GOODSID=@goodsId
select top 1 @tasksId=tasksId from PRODUCE_TASKS where GOODSID=@goodsId and SALEORDER_BILLCODE=@billCode order by tasksId desc
end
--向生产任务用料表中添加数据
insert into PRODUCE_TASKSDETAIL(SALEORDER_BILLCODE,TASKSID,GOODSID,UNITID,GCOUNT,GPRICE)
select @billCode,@tasksId,a.GOODSID,a.UNITID,
case c.STANDBATCH
when '0' then @unitCount*a.STANDBATCH
else @unitCount/c.STANDBATCH*a.STANDBATCH
end
,b.APRICE from PRODUCE_BOM_SUB as a,BASE_GOODS as b,PRODUCE_BOM_BOM as c
where a.GOODSID=b.GOODSID and a.BOMID=c.BOMID and a.BOMID in(select BOMID from PRODUCE_BOM_BOM where GOODSID=@goodsId)
fetch my_cursor into @wlid,@userId,@unitCount,@goodsId,@departId,@billCode
end
close my_cursor
end
deallocate my_cursor
-- 调用存储过程
exec selSubBom @billCode
--计算总金额
update PRODUCE_TASKSDETAIL set TOTALMONEY=GCOUNT*GPRICE where SALEORDER_BILLCODE=@billCode
-- 调用其他存储过程
exec insertGoodsPlan @billCode
end
Declare是tran-sql对关键字,表示定义一个变量或对象,CURSOR表示游标对象,那么一行代码的意思就创建一个名字为@mycursor
的游标对象,,目前还是一个null对象,不能拿到数据。必须将游标和查询结果集绑定
Declare mycursor CURSOR
For SELECT ID,LOGIN_NAME,RUSUME_CODE,TRUE_NAME,BIRTHDAY FROM RESUME_T
ORDER BY ID DESC
上面已经将一个游标@mycursor和一个查询绑定起来了。看看是怎么关联的呢?就是关键字For,现在游标仍然不能用因为还没有打开游标
打开游标,语法如下
open mycursor
上面我们通过open打开了一个mycursor游标,这时mycursor已经有数据了,在你自己的查询分析器里写一个像这样的最简单的例子
,看看结果,如果没报错那么你的代码是ok的,可是并没有看到预期的结果数据。别急下面就告诉你怎么让数据显示出来
在前面代码的最后再加入一行代码如下:
FETCH NEXT FROM mycursor
执行查询分析器,看到了下面一行数据,如下:
37 admin P080802002 admin 1984/1/28
上面一行语句中,我们拿到了一条数据,通过FETCH NEXT 我们拿到了一行数据,FROM
指向数据源mycursor,就是我们前面定义的游标对象,英文中FETCH
是拿的意思,Next的意思不用说了,代表了方向,向后滚动。记住Fetch,只能拿一行数据
那么如何向后便利,整个结果呢?游标的做法如下代码
WHILE @@fetch_status = 0
FETCH NEXT FROM mycursor
上面两行执行后,显示如下:
52 guolili P081228001 郭丽丽 1986/6/1
51 user6 P080802015 user6 1959/2/3
50 admin6 P080802014 admin6 1984/1/28
49 user5 P080802013 user5 1959/2/3
这显然是正确的结果,通过
上面两行代码我们向后便利了所有数据,while是tran-sql循环的关键字,@@fetch_status
返回上次执行Fetch命令的状态,在每次用Fetch从游标中读取数据时,都会检查该变量,以确定上次Fetch操作是否成功,决定下一次的处理。
@@FETCH_STATUS返回值如下:
返回值 描述
0 FETCH语句成功
-1 FETCH语句失败或此行不在结集中
-2 被提取的行不存在
关于游标的方向有以下:
NEXT:返回当前行的下一行
PRIOR:返回当前行的前一行
FIRST:返回当前游标中的第一行
LAST:返回当前游标中最后一行
ABSOLUTE n:返回游标中第n行
在存储过程中case的写法
case IsUser
when '0' then '赋值/做计算'
else '赋值/做计算'
end
分享到:
相关推荐
定义了一个游标,使用declare 游标名 cursor for 来定义游标,该处查询用户表里的用户名, 存储过程处理完成后,游标就消失(因为它局限于存储过程)
一、SQL server 游标的简单使用 一个对表进行操作的T-SQL语句通常都可产生或处理一组记录,但是许多应用程序,尤其是T-SQL嵌入的主语言,通常不能把整个结果集作为一个单元来处理,这些应用程序就需要用一种机制来...
oracle笔记游标的使用,游标的详细代码案例,游标知识点笔记!
详细介绍了 oracle的游标使用 及 实例
你也在为LatchFree、Librarycache争用那些事头疼吗,快来看看本文作者是怎么解决的。
11-3--游标Cursor1
DECLARE cursor_name [ INSENSITIVE ] [ SCROLL ] CURSOR FOR select_statement [ FOR { READ ONLY | UPDATE [ OF column_name [ ,...n ] ] } ] Transact-SQL扩展语法 DECLARE cursor_name CURSOR [ LOCAL | ...
利用游标执行删除查询统计 cursor, 执行动态sql
说实的,使用MS SQL Server这样久,游标一直没有使用过。以前实现相似的功能,都是使用WHILE循环加临时表来实现。刚才有参考网上示例练习写了一下。了解到游标概念与语法。 下面代码示例中, 先是宣告你在游标中需...
游标及存储过程 通过判断微信号是否存在执行不同的操作
隐式游标(Implicit Cursor):是指非PL/SQL程序中定义的、而且是在PL/SQL中使用UPDATE/DELETE语句时,Oracle系统自动分配的游标。 一.显示游标 1.使用步骤 (1)定义 (2)打开 (3)使用 (4)关闭 2.使用演示 首先创建...
1.创建游标 代码如下:DECLARE calc_bonus CURSOR FOR SELECT id, salary, commission FROM employees; 2.打开游标 代码如下:OPEN calc_bonus; 3.使用游标 代码如下:FETCH calc_bonus INTO re_id, re_salary, re_comm...
游标(cursor)是一个存储在DBMS服务器上的数据库查询,它不是一条SELECT语句,而是被该语句检索出来的结果集。在存储了游标之后,应用程序可以根据需要滚动或浏览其中的数据。 使用游标 使用游标的步骤: 在使用...
cursor的基本用法 主要是针对sql的用法 如声明 用法 关闭等等
oracle数据库中的游标cursor在应用中具有极高的实用性。
sqlserver中关于游标的使用,很经典的教程
游标名> Cursor For 2)创建游标语句 Open <游标名> 3)提取游标列值、移动记录指针 Fetch <列名列表> From <游标名> [Into <变量列表>] 4)使用@@Fetch_Status利用While循环处理游标中的行 5)删除游标...
设置双游标,并且读取X轴值。需要设置属性节点-活动游标,然后在拖动添加X轴位置。这个难点很多人遇到过
在Oracle 9i及其以后的版本中,还增加了使用BULK COLLECT子句批量绑定数据和使用CURSOR表达式实现嵌套游标的功能。本章将主要介绍如何使用显式游标进行多行数据的查询、游标FOR循环以及游标变量的使用,另外还将介绍...