一个最简单的游标的作用,该如何处理

1 & &什么是游标:
关系数据库中的操作会对整个行集起作用。 例如,由 SELECT 语句返回的行集包括满足该语句的 WHERE 子句中条件的所有行。 这种由语句返回的完整行集称为结果集。 应用程序,特别是交互式联机应用程序,并不总能将整个结果集作为一个单元来有效地处理。 这些应用程序需要一种机制以便每次处理一行或一部分行。 游标就是提供这种机制的对结果集的一种扩展。
游标通过以下方式来扩展结果处理:
允许定位在结果集的特定行。
从结果集的当前位置检索一行或一部分行。
支持对结果集中当前位置的行进行数据修改。
为由其他用户对显示在结果集中的数据库数据所做的更改提供不同级别的可见性支持。
提供脚本、存储过程和触发器中用于访问结果集中的数据的 Transact-SQL 语句。&
不难理解,游标与其他数据库操作的最大不同就是对象是单条记录而不是结果集,一般用于过程化程序里嵌入的SQL语句。在数据库服务程序里用到了自动隐含创建的游标。
2 & &基本用法:
2.1 声明游标
DECLARE 游标名 CURSOR
FOR SELECT语句
2.2 打开游标
OPEN 游标名
2.3 从游标获取数据
FETCH NEXT FROM 游标名 [ INTO FETCH_LIST ]
从游标获取数据需要注意可能到达游标末尾,以下方法解决这个问题以避免用户在关闭游标时产生错误
DECLARE @custname VARCHAR(20)
DECLARE namecursor CURSOR FOR SELECT CUST_NAME FROM TBL_CUSTOMER OPEN namecursor
FETCH NEXT FROM namecursor INTO @custname
WHILE (@@FETCH_STATUS && -1)
IF (@@FETCH_STATUS && -2)
--操作游标变量
FETCH NEXT FROM namecursor INTO @custname
13 CLOSE namecursor
14 DEALLOCATE namecursor
2.4 关闭游标
CLOSE 游标名
关闭后不能对游标进行读取等操作,但可以使用OPEN语句再次打开
2.5 释放游标
DEALLOCATE 游标名
即删除游标,不可再使用
3 & &一个有意思的小例子:
虽然知道了游标的概念和基本用法,但对于什么时候用游标还很模糊,甚至误认为游标可以被子查询所代替。直到遇到了这个有意思的小例子:
表结构如下:
题目要求是:列出从事同一种工作但属于不同部门的雇员的不同组合
即如下结果:
在想尽了子查询、表连接、建临时表等等办法之后,我发现我遇到了一个不可逾越的障碍:无法排除两个名字组合的唯一性。即:我得到的结果可能是如下
最终我想到了刚学到的游标,代码如下
1 SELECT A.Ename AS ANAME, B.Ename AS BNAME
3 FROM EMP A
4 JOIN EMP B
5 ON A.job = B.job AND A.deptNo && B.deptNo and A.Ename&&b.Ename
6 ORDER BY ANAME
8 --DROP TABLE #t
10 DECLARE TEST_CURSOR CURSOR FOR
11 SELECT ANAME, BNAME FROM #t
13 OPEN TEST_CURSOR
14 DECLARE @ANAME VARCHAR(20)
15 DECLARE @BNAME VARCHAR(20)
17 FETCH NEXT FROM TEST_CURSOR INTO @ANAME, @BNAME
18 DELETE FROM #t WHERE ANAME=@BNAME AND BNAME=@ANAME
19 WHILE @@FETCH_STATUS = 0
FETCH NEXT FROM TEST_CURSOR INTO @ANAME, @BNAME
DELETE FROM #t WHERE ANAME=@BNAME AND BNAME=@ANAME
25 CLOSE TEST_CURSOR
26 DEALLOCATE TEST_CURSOR
28 SELECT * FROM #t
--------------------------------------------------------------------------------------
--12.2更新:
突然发现这题可以用极其简单的方法写出来,用游标简直Stupid~~
1 SELECT A.Ename AS ANAME, B.Ename AS BNAME
2 FROM EMP A, EMP B
3 WHERE A.job = B.job AND A.deptNo && B.deptNo AND A.Ename & B.Ename
4 ORDER BY ANAME
掩面遁走~~
阅读(...) 评论()mysql游标示例mysql游标简易教程
从 V5.5开始,进行了一次大的改变,就是将InnoDB作为默认的存储引擎。InnoDB支持事务,而且拥有相关的RDBMS特性:ACID事务支持,数据完整性(支持外键),灾难恢复能力等等。
现在简单总结一下游标的知识。
(一),认识游标(cursor)
就是一个可读的标识,用来标识数据取到什么地方了。
(二),游标特性
3,不敏感的
(三),使用游标
需要强调的是,游标必须在定义处理程序之前被定义,但变量必须在定义游标之前被定义,顺序就是变量定义-游标定义-处理程序。
1.定义游标
DECLARE cursor_name CURSOR FOR select_statement
这个语句声明一个游标。也可以在子程序中定义多个游标,一个块中的每一个游标必须命名唯一。声明游标后也是单条操作的。
2. 游标OPEN
OPEN cursor_name
这个语句打开先前声明的游标。
3. 游标FETCH
FETCH cursor_name INTO var_name [, var_name] ...
这个语句用指定的打开游标读取下一行(如果有下一行的话),并且前进游标指针至该行。
4. 游标CLOSE
CLOSE cursor_name
这个语句关闭先前打开的游标,注意,用完后必须关闭。
(四)示例,下面是一个存储过程,里面用到游标,逐条更新数据(批量更新数据)
no_more_record INT DEFAULT 0;
pID BIGINT(20);
pValue DECIMAL(15,5);
cur_record CURSOR FOR
SELECT colA, colB from tableABC;
/*首先这里对游标进行定义*/
CONTINUE HANDLER FOR NOT FOUND
no_more_record = 1; /*这个是个条件处理,针对NOT FOUND的条件,当没有记录时赋值为1*/
cur_ /*接着使用OPEN打开游标*/
cur_record INTO pID, pV /*把第一行数据写入变量中,游标也随之指向了记录的第一行*/
WHILE no_more_record != 1 DO
INTO testTable(ID, Value)
(pID, pValue);
cur_record INTO pID, pV
END WHILE;
/*用完后记得用CLOSE把资源释放掉*/游标的使用可以简单归类为5个步骤:
1.定义游标
2.打开游标
3.使用游标
4.关闭游标
5.释放游标
如下是游标简单实用的示例:
--1.定义游标
DECLARE test_Cursor CURSOR FOR
SELECT ID,NAME FROM TEST
--2.打开游标
OPEN test_Cursor
--3.使用游标
DECLARE @ID INT,@NAME VARCHAR
FETCH NEXT FROM test_Cursor INTO @ID,@NAME
WHILE @@FETCH_STATUS=0
PRINT @ID print @Name
FETCH NEXT FROM test_Cursor INTO @ID,@NAME
--4.关闭游标
CLOSE test_Cursor
--5.释放游标
DEALLOCATE test_Cursor
遍历TEST表的每一行,输出每行的ID 和 NAME。
应用场景:
需要循环从一张表里取值并判断作相应的处理,有时候也可以使用临时表结合while循环来替代游标操作,实践证明,游标的操作更快。
游标是邪恶的,游标是每循环一次返回一条结果集,而SELECT查询是返回全部的结果集。之前看有网友举了一个形象生动的例子,游标就好比你去ATM机取1000块钱,你每次取100,分10次取出来。所以能不使用游标尽量不要使用游标,在我们穷尽了子查询,while循环,临时表,表变量,自建函数仍不能实现的时候,使用游标实现。
游标的概念和作用
游标的详细用法
游标的使用
sql 游标的基本用法
SQL游标使用及实例
游标定义与使用
oracle中游标的用法总结及示例
游标的使用
没有更多推荐了,&>&.Net Oracle一次请求执行多条sql语句
Oracle批处理 使用游标一次执行多条Sql语句
.Net Oracle一次请求执行多条sql语句
Oracle批处理 使用游标一次执行多条Sql语句
上传大小:166KB
Oracle 一次请求执行多条sql语句
在.net 中查询Sql Server 一次请求执行多条sql语句很简单
拼接起来就好了
初次接触oracle 在网上寻找了很多方法终于被我解决了
我把问题想复杂了
例子中提供了2种解决方案
一种是用游标
还有一种就是很简单的拼接字符串的方法 语法略微和sql server有些区别 适合新手学习
综合评分:3
{%username%}回复{%com_username%}{%time%}\
/*点击出现回复框*/
$(".respond_btn").on("click", function (e) {
$(this).parents(".rightLi").children(".respond_box").show();
e.stopPropagation();
$(".cancel_res").on("click", function (e) {
$(this).parents(".res_b").siblings(".res_area").val("");
$(this).parents(".respond_box").hide();
e.stopPropagation();
/*删除评论*/
$(".del_comment_c").on("click", function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_invalid/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parents(".conLi").remove();
alert(data.msg);
$(".res_btn").click(function (e) {
var parentWrap = $(this).parents(".respond_box"),
q = parentWrap.find(".form1").serializeArray(),
resStr = $.trim(parentWrap.find(".res_area_r").val());
console.log(q);
//var res_area_r = $.trim($(".res_area_r").val());
if (resStr == '') {
$(".res_text").css({color: "red"});
$.post("/index.php/comment/do_comment_reply/", q,
function (data) {
if (data.succ == 1) {
var $target,
evt = e || window.
$target = $(evt.target || evt.srcElement);
var $dd = $target.parents('dd');
var $wrapReply = $dd.find('.respond_box');
console.log($wrapReply);
//var mess = $(".res_area_r").val();
var mess = resS
var str = str.replace(/{%header%}/g, data.header)
.replace(/{%href%}/g, 'http://' + window.location.host + '/user/' + data.username)
.replace(/{%username%}/g, data.username)
.replace(/{%com_username%}/g, data.com_username)
.replace(/{%time%}/g, data.time)
.replace(/{%id%}/g, data.id)
.replace(/{%mess%}/g, mess);
$dd.after(str);
$(".respond_box").hide();
$(".res_area_r").val("");
$(".res_area").val("");
$wrapReply.hide();
alert(data.msg);
}, "json");
/*删除回复*/
$(".rightLi").on("click", '.del_comment_r', function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_comment_del/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parent().parent().parent().parent().parent().remove();
$(e.target).parents('.res_list').remove()
alert(data.msg);
//填充回复
function KeyP(v) {
var parentWrap = $(v).parents(".respond_box");
parentWrap.find(".res_area_r").val($.trim(parentWrap.find(".res_area").val()));
评论共有4条
最好是用存储过程来进行批处理
感觉不是很好用
不是我想要的
VIP会员动态
CSDN下载频道资源及相关规则调整公告V11.10
下载频道用户反馈专区
下载频道积分规则调整V1710.18
spring mvc+mybatis+mysql+maven+bootstrap 整合实现增删查改简单实例.zip
资源所需积分/C币
当前拥有积分
当前拥有C币
输入下载码
为了良好体验,不建议使用迅雷下载
.Net Oracle一次请求执行多条sql语句
Oracle批处理 使用游标一次执行多条Sql语句
会员到期时间:
剩余下载个数:
剩余积分:0
为了良好体验,不建议使用迅雷下载
积分不足!
资源所需积分/C币
当前拥有积分
您可以选择
程序员的必选
绿色安全资源
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
您的积分不足,将扣除 10 C币
为了良好体验,不建议使用迅雷下载
无法举报自己的资源
你当前的下载分为234。
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可返还被扣除的积分
被举报人:
请选择类型
资源无法下载 ( 404页面、下载失败、资源本身问题)
资源无法使用 (文件损坏、内容缺失、题文不符)
侵犯版权资源 (侵犯公司或个人版权)
虚假资源 (恶意欺诈、刷分资源)
含色情、危害国家安全内容
含广告、木马病毒资源
*投诉人姓名:
*投诉人联系方式:
*版权证明:
*详细原因:
.Net Oracle一次请求执行多条sql语句
Oracle批处理 使用游标一次执行多条Sql语句mysql中创建最简单的游标总是失败_百度知道
mysql中创建最简单的游标总是失败
哪位帮忙看看declareabccursorforselect*fromcustomerswherecust_和书上的例子一样啊,为什么老是出错?...
哪位帮忙看看declare abc cursorforselect* from customerswhere cust_和书上的例子一样啊,为什么老是出错?
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
来自知道合伙人认证行家
互联网类行家
采纳数:21701
获赞数:17651
2011年中山职业技术学院毕业,现担任毅衣公司京东小二
创建存储过程和触发器1、建表首先先建两张表(users表和number表),具体设计如下图:2、存储过程新建一个函数,用来往users表中插入数据,创建过程如下:新建函数—(过程)完成--然后插入代码及名字。保存以后单击运行,可以看到users表中的数据如下:整个存储过程的编写就完成了,当然这只是一个极为简单的例子,仅供入门参考。3、触发器在写触发器之前,我们先把users的数据清空现在我们有两个表,我要做的事情就是,当我往users中插入数据后,number中也相应变化:例如,number表中有一条初始数据,id=1,num=0;当我往users中插入一条数据后,就触发number表中的num字段就加1,也就是记录用户数。下面我们来实现这个小小的功能。右击users表,选择设计表,再选择触发器选项,在定义处写入代码:beginupdate numberset num = (select count(*) from users) ;end触发器图示:保存后,再往users表中添加新数据,再查看一下number中的数据,你会神奇的发现,number表中的数据也变了,自己动手试一下吧!ps:存储过程需要程序员自己去执行,触发器,顾名思义,自动触发。4、游标使用首先我将users表中的数据清空(当然不清空也可以),然后再往里面填充数据,如下图所示:我现在想做的是将student_ID字段都加上100,通过这个例子简单展示一下游标的使用。创建一个存储过程,创建方式参考上面步骤。存储过程代码如下:BEGIN#Routine body goes here...declare tmp bigint default 0;declare cur CURSOR FOR SELECT student_ID FROM&&--&定义游标declare CONTINUE HANDLER FOR SQLSTATE '02000' set tmp = 0;OPEN&&--&打开游标FETCH cur INTO&&--&游标向下走一步WHILE(tmp != 0)DO&&&--&将tmp打印出来,会发现tmp就像一个指针,一开始指向第一行,游标走一步,则指向下一行记录UPDATE usersSET student_ID = tmp + 100WHERE student_ID =FETCH cur INTOEND WHILE;CLOSE&&--&关闭游标END执行上面的存储过程,你会发现,users中的数据如你所愿的发生了变化。当然,这个功能直接用循环就可以解决,我这里只是简单展示一下游标的用法,利于对游标有个感性认识。that‘s&&all~
好多,慢慢看....游标只是能在存储过程中使用吗,我把它当成个可取数的视图用行不行?
为你推荐:
其他类似问题
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 数据库游标 的文章

 

随机推荐