`
zhaolicric
  • 浏览: 143449 次
  • 性别: Icon_minigender_2
  • 来自: 青岛
社区版块
存档分类
最新评论

游标的使用Cursor

    博客分类:
  • SQL
阅读更多

下面是我的一个游标,存储过程的例子。。

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

分享到:
评论

相关推荐

    youngzil#quickstart-database#游标(cursor)的定义1

    定义了一个游标,使用declare 游标名 cursor for 来定义游标,该处查询用户表里的用户名, 存储过程处理完成后,游标就消失(因为它局限于存储过程)

    SQL Server 游标的简单使用

    一、SQL server 游标的简单使用 一个对表进行操作的T-SQL语句通常都可产生或处理一组记录,但是许多应用程序,尤其是T-SQL嵌入的主语言,通常不能把整个结果集作为一个单元来处理,这些应用程序就需要用一种机制来...

    oracle笔记游标的使用

    oracle笔记游标的使用,游标的详细代码案例,游标知识点笔记!

    oracle游标使用及实例

    详细介绍了 oracle的游标使用 及 实例

    Latch Free、Library cache伪游标(pseudo cursor)之间的那些事

    你也在为LatchFree、Librarycache争用那些事头疼吗,快来看看本文作者是怎么解决的。

    11-3--游标Cursor1

    11-3--游标Cursor1

    关于游标使用sql

    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

    利用游标执行删除查询统计 cursor, 执行动态sql

    MS SQL Server游标(CURSOR)的学习使用

    说实的,使用MS SQL Server这样久,游标一直没有使用过。以前实现相似的功能,都是使用WHILE循环加临时表来实现。刚才有参考网上示例练习写了一下。了解到游标概念与语法。 下面代码示例中, 先是宣告你在游标中需...

    游标及存储过程 cursor_proc

    游标及存储过程 通过判断微信号是否存在执行不同的操作

    Oracle 游标使用总结

    隐式游标(Implicit Cursor):是指非PL/SQL程序中定义的、而且是在PL/SQL中使用UPDATE/DELETE语句时,Oracle系统自动分配的游标。 一.显示游标 1.使用步骤 (1)定义 (2)打开 (3)使用 (4)关闭 2.使用演示 首先创建...

    MySql游标的使用实例

    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...

    sqlserver游标使用步骤示例(创建游标 关闭游标)

    游标(cursor)是一个存储在DBMS服务器上的数据库查询,它不是一条SELECT语句,而是被该语句检索出来的结果集。在存储了游标之后,应用程序可以根据需要滚动或浏览其中的数据。 使用游标 使用游标的步骤: 在使用...

    sql游标 cursor

    cursor的基本用法 主要是针对sql的用法 如声明 用法 关闭等等

    cursor游标

    oracle数据库中的游标cursor在应用中具有极高的实用性。

    sqlserver游标的使用,游标是邪恶的

    sqlserver中关于游标的使用,很经典的教程

    MSSQL 游标使用 心得

    游标名> Cursor For 2)创建游标语句 Open <游标名> 3)提取游标列值、移动记录指针 Fetch <列名列表> From <游标名> [Into <变量列表>] 4)使用@@Fetch_Status利用While循环处理游标中的行 5)删除游标...

    set-double-X-Cursor-and-read.rar_cursor_labview游标_游标

    设置双游标,并且读取X轴值。需要设置属性节点-活动游标,然后在拖动添加X轴位置。这个难点很多人遇到过

    Oracle 游标的使用

    在Oracle 9i及其以后的版本中,还增加了使用BULK COLLECT子句批量绑定数据和使用CURSOR表达式实现嵌套游标的功能。本章将主要介绍如何使用显式游标进行多行数据的查询、游标FOR循环以及游标变量的使用,另外还将介绍...

Global site tag (gtag.js) - Google Analytics