下面是我的一个游标,存储过程的例子。。
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 来定义游标,该处查询用户表里的用户名, 存储过程处理完成后,游标就消失(因为它局限于存储过程)
在Oracle数据库中,游标(Cursor)是一种非常重要的编程工具,尤其在处理复杂的数据操作时。游标允许我们逐行处理查询结果,这对于迭代、条件判断或者数据更新等任务非常实用。下面,我们将深入探讨Oracle游标的使用...
游标(Cursor)在数据库系统中的应用 在数据库系统中,游标(Cursor)是一种重要的概念,它允许开发者对数据库中的数据进行遍历和操作。游标可以看作是一种指针,指向当前记录集的某一行,通过游标,可以对记录集...
### SQL 游标 (Cursor) 的基本用法 在数据库操作中,游标(Cursor)是一种重要的机制,它允许用户逐行处理查询结果集中的数据。与直接执行SQL语句并返回所有匹配行不同,游标可以让我们更灵活地控制数据的检索方式...
在 PL/SQL 中,游标的声明使用 CURSOR 关键字,例如: ```sql DECLARE CURSOR c_emp IS SELECT * FROM emp; ``` 这里声明了一个名为 c_emp 的游标,该游标用于查询 emp 表中的所有记录。 二、游标的打开和关闭 ...
游标(Cursor)是一种机制,它允许我们遍历和操作由SQL查询返回的结果集。通过游标,我们可以控制数据的读取顺序,一次只处理一行,或者在处理完一行后移动到下一行。 2. **游标的属性**: - `%FOUND`:用于检查...
在SQL编程中,游标(Cursor)是一种非常重要的工具,它允许我们按需逐行处理结果集,这对于处理批量数据或者进行复杂的数据操作至关重要。游标对于初学者来说可能有些抽象,但一旦掌握了其基本使用方法,就能在很多...
根据提供的标题、描述以及部分代码内容,我们可以详细探讨Oracle游标的使用方法,特别是明确游标(Explicit Cursor)和隐式游标(Implicit Cursor)的区别及其具体应用方式。 ### Oracle游标简介 在Oracle数据库中...
### Oracle游标使用及实例详解 #### 一、Oracle游标概述 在Oracle数据库中,游标(Cursor)是一种用于处理SQL查询结果集的方式。它允许用户逐行地读取和处理查询结果,这对于需要对每一行数据进行特定操作的情况非常...
一、SQL server 游标的简单使用 一个对表进行操作的T-SQL语句通常都可产生或处理一组记录,但是许多应用程序,尤其是T-SQL嵌入的主语言,通常不能把整个结果集作为一个单元来处理,这些应用程序就需要用一种机制来...
- 游标(Cursor):它是一个数据库系统中的结构,用于存储执行SQL查询后的结果集信息。游标允许我们遍历结果集,并对每一行进行操作。 - 局部游标和全局游标:局部游标在PL/SQL块中定义,仅在该块的范围内有效;...
这篇文档《Oracle 游标使用大全》应该涵盖了关于Oracle游标的各种使用方法和最佳实践。 1. **游标的定义与类型** - 游标(Cursor)是数据库系统中一个概念,用于跟踪查询结果集中的当前位置。 - Oracle游标有两种...
1. **声明游标**:使用`DECLARE`关键字定义了一个名为`Product_Cursor`的游标,它用于从`ERun_8..PD01_Product`表中检索所有以`374-5`开头的产品号及其名称和规格。 2. **打开游标**:使用`OPEN`关键字打开游标,...
### Oracle游标使用大全 #### 一、概述 在Oracle数据库中,游标是一种重要的机制,用于处理查询结果集中的数据。游标允许程序逐行处理数据,这在需要对多行数据进行循环处理时非常有用。本文档旨在提供一个全面的...
### 数据库游标使用详解:Oracle数据库视角 在数据库领域,游标(Cursor)是一种用于处理数据查询结果集的强大工具,尤其在Oracle数据库中,游标的应用极为广泛且功能强大。本文将深入探讨Oracle数据库中游标的基本...
游标(Cursor)是 PL/SQL 中的一种数据访问机制,通过游标,可以访问和处理数据库中的数据。游标可以认为是一个指向数据库中特定记录的指针,通过游标,可以读取、插入、更新和删除数据库中的数据。 二、游标的类型...
另外,伪游标(pseudo cursor)是Oracle数据库中用于描述SQL语句的内部数据结构,它记录了SQL语句的执行计划和其他信息。 在处理LatchFree问题和Library cache争用时,首先要明确的是,这些争用问题通常会导致CPU...
oracle笔记游标的使用,游标的详细代码案例,游标知识点笔记!
### SQL游标使用详解 #### 一、引言 在SQL编程中,游标是一种用于处理查询结果集的工具,可以实现对数据行的逐行访问。本文将通过一个具体的示例来详细介绍如何使用SQL游标,并解释其背后的原理与应用场景。 ####...