`
zhaolicric
  • 浏览: 145912 次
  • 性别: 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 来定义游标,该处查询用户表里的用户名, 存储过程处理完成后,游标就消失(因为它局限于存储过程)

    ORACLE 游标使用示例

    在Oracle数据库中,游标(Cursor)是一种非常重要的编程工具,尤其在处理复杂的数据操作时。游标允许我们逐行处理查询结果,这对于迭代、条件判断或者数据更新等任务非常实用。下面,我们将深入探讨Oracle游标的使用...

    11-3--游标Cursor1

    游标(Cursor)在数据库系统中的应用 在数据库系统中,游标(Cursor)是一种重要的概念,它允许开发者对数据库中的数据进行遍历和操作。游标可以看作是一种指针,指向当前记录集的某一行,通过游标,可以对记录集...

    sql游标 cursor

    ### SQL 游标 (Cursor) 的基本用法 在数据库操作中,游标(Cursor)是一种重要的机制,它允许用户逐行处理查询结果集中的数据。与直接执行SQL语句并返回所有匹配行不同,游标可以让我们更灵活地控制数据的检索方式...

    Oracle游标使用方法及语法大全

    在 PL/SQL 中,游标的声明使用 CURSOR 关键字,例如: ```sql DECLARE CURSOR c_emp IS SELECT * FROM emp; ``` 这里声明了一个名为 c_emp 的游标,该游标用于查询 emp 表中的所有记录。 二、游标的打开和关闭 ...

    oracle数据库游标使用例子

    游标(Cursor)是一种机制,它允许我们遍历和操作由SQL查询返回的结果集。通过游标,我们可以控制数据的读取顺序,一次只处理一行,或者在处理完一行后移动到下一行。 2. **游标的属性**: - `%FOUND`:用于检查...

    SQL经典游标使用方法

    在SQL编程中,游标(Cursor)是一种非常重要的工具,它允许我们按需逐行处理结果集,这对于处理批量数据或者进行复杂的数据操作至关重要。游标对于初学者来说可能有些抽象,但一旦掌握了其基本使用方法,就能在很多...

    Oracle游标使用详解

    根据提供的标题、描述以及部分代码内容,我们可以详细探讨Oracle游标的使用方法,特别是明确游标(Explicit Cursor)和隐式游标(Implicit Cursor)的区别及其具体应用方式。 ### Oracle游标简介 在Oracle数据库中...

    oracle游标使用及实例

    ### Oracle游标使用及实例详解 #### 一、Oracle游标概述 在Oracle数据库中,游标(Cursor)是一种用于处理SQL查询结果集的方式。它允许用户逐行地读取和处理查询结果,这对于需要对每一行数据进行特定操作的情况非常...

    SQL Server 游标的简单使用

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

    Oracle游标使用案例大全

    - 游标(Cursor):它是一个数据库系统中的结构,用于存储执行SQL查询后的结果集信息。游标允许我们遍历结果集,并对每一行进行操作。 - 局部游标和全局游标:局部游标在PL/SQL块中定义,仅在该块的范围内有效;...

    Oracle 游标使用大全

    这篇文档《Oracle 游标使用大全》应该涵盖了关于Oracle游标的各种使用方法和最佳实践。 1. **游标的定义与类型** - 游标(Cursor)是数据库系统中一个概念,用于跟踪查询结果集中的当前位置。 - Oracle游标有两种...

    SQL游标使用金典

    1. **声明游标**:使用`DECLARE`关键字定义了一个名为`Product_Cursor`的游标,它用于从`ERun_8..PD01_Product`表中检索所有以`374-5`开头的产品号及其名称和规格。 2. **打开游标**:使用`OPEN`关键字打开游标,...

    Oracle游标使用大全

    ### Oracle游标使用大全 #### 一、概述 在Oracle数据库中,游标是一种重要的机制,用于处理查询结果集中的数据。游标允许程序逐行处理数据,这在需要对多行数据进行循环处理时非常有用。本文档旨在提供一个全面的...

    数据库游标使用详细介绍

    ### 数据库游标使用详解:Oracle数据库视角 在数据库领域,游标(Cursor)是一种用于处理数据查询结果集的强大工具,尤其在Oracle数据库中,游标的应用极为广泛且功能强大。本文将深入探讨Oracle数据库中游标的基本...

    oracle 游标使用大全

    游标(Cursor)是 PL/SQL 中的一种数据访问机制,通过游标,可以访问和处理数据库中的数据。游标可以认为是一个指向数据库中特定记录的指针,通过游标,可以读取、插入、更新和删除数据库中的数据。 二、游标的类型...

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

    另外,伪游标(pseudo cursor)是Oracle数据库中用于描述SQL语句的内部数据结构,它记录了SQL语句的执行计划和其他信息。 在处理LatchFree问题和Library cache争用时,首先要明确的是,这些争用问题通常会导致CPU...

    oracle笔记游标的使用

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

    SQL游标使用例子--有注释

    ### SQL游标使用详解 #### 一、引言 在SQL编程中,游标是一种用于处理查询结果集的工具,可以实现对数据行的逐行访问。本文将通过一个具体的示例来详细介绍如何使用SQL游标,并解释其背后的原理与应用场景。 ####...

Global site tag (gtag.js) - Google Analytics