精华内容
下载资源
问答
  • 什么是Sql数据库游标

    千次阅读 2020-05-26 17:47:38
    为什么要使用游标 游标可以把集合操作变成单记录操作,游标的机制可以使用户对数据逐行操作,按我们的想法对这些数据进行操作。 游标的运用 数据库 游标的创建 --创建一个游标cc --价格小于50的为便宜 --价格大于50...

    什么是游标

    游标是存放SQL语句结果的一个结果集,使用游标用户可以对数据逐行访问,可以使我们按照自己的意愿来显示和修改这些记录。

    为什么要使用游标

    游标可以把集合操作变成单记录操作,游标的机制可以使用户对数据逐行操作,按我们的想法对这些数据进行操作。

    游标的运用

    数据库
    在这里插入图片描述
    游标的创建

    --创建一个游标cc
    --价格小于50的为便宜
    --价格大于50小于70的为小贵
    --价格大于70的为奢侈
    declare cc CURSOR
    for
    select id,price from Books
    

    游标的使用

    --调用游标
    open cc
    --获取数据
    declare @id int
    declare @price decimal(18,0)
    fetch next from cc into @id,@price
    --循环获取
    while (@@FETCH_STATUS=0)
    begin
    --修改等级
    if(@price<50)
    update Books set Levels='便宜' where id=@id
    else if(@price<70)
    update Books set Levels='小贵' where id=@id
    else
    update Books set Levels='奢侈' where id=@id
    fetch next from cc into @id,@price
    end

    结果:
    在这里插入图片描述
    关闭游标

    close cc

    释放游标

    deallocate cc

    `

    展开全文
  • oracle数据库游标使用

    千次阅读 2018-07-27 01:33:44
    为什么要使用游标? 在写java程序中有集合的概念,那么在pl/sql中也会用到多条记录,这时候要用到游标,游标可以存储查询返回的多条数据 语法: CURSOR 游标名 [(参数名 数据类型, 参数名 数据类型…)] IS ...

    游标(光标Cursor)

    为什么要使用游标?
    这里写图片描述
    在写java程序中有集合的概念,那么在pl/sql中也会用到多条记录,这时候要用到游标,游标可以存储查询返回的多条数据
    语法:
    CURSOR 游标名 [(参数名 数据类型, 参数名 数据类型…)] IS SELECT 语句;
    例如:cursor c1 is select ename from emp;
    游标的使用步骤:
    打开游标: open c1;(打开游标执行查询)
    取一行游标的值: fetch c1 into pjob;(取一行到变量中)
    关闭游标:close c1;(关闭游标释放资源)
    游标的结束方式 exit when c1 %notfound
    注意:上面的pjob必须与emp表中的job列类型一致
    定义:pjob emp.empjob%type;
    示例1:

    declare 
       --定义光标(游标)
       cursor cemp is select ename,sal from emp;
       pename emp.ename%type;
       psal   emp.sal%type;
    begin
      --打开
      open cemp;
    
      loop
           --取当前记录
           fetch cemp into pename,psal;
           --exit when 没有取到记录;
           exit when cemp%notfound;
    
           dbms_output.put_line(pename||'的薪水是'||psal);
      end loop;
    
      --关闭
      close cemp;
    end;
    /

    `
    结果
    示例2:带参数的游标

    -- 查询某个部门的员工姓名
    declare 
       --形参
       cursor cemp(dno number) is select ename from emp where deptno=dno;
       pename emp.ename%type;
    begin
       --实参
       open cemp(20);
       loop
            fetch cemp into pename;
            exit when cemp%notfound;
    
            dbms_output.put_line(pename);
    
       end loop;
       close cemp;
    end;
    /
    

    这里写图片描述

    展开全文
  • 本文目录前言为什么要使用游标使用游标的SQL语句1. 查询结果为多条记录的SELECT语句2. CURRENT形式的UPDATE和DELETE语句 前言 将SQL嵌入到高级语言中混合编程,SQL语句负责操纵数据库,高级语言语句负责控制逻辑...

    本文主讲SQL Server数据库中 游标CURSOR 的使用,欢迎阅读~


    前言

    将SQL嵌入到高级语言中混合编程,SQL语句负责操纵数据库,高级语言语句负责控制逻辑流程。
    数据库工作单元与源程序工作单元之间的通信主要包括:
    (1) 向主语言传递SQL语句的执行状态信息,使主语言能够据此信息控制程序流程,主要用SQL通信区( SQL Communication Area, SQLCA)实现。
    (2) 主语言向SQL语句提供参数,主要用主变量(host variable) 实现。
    (3) 将SQL语句查询数据库的结果交主语言处理,主要用主变量和游标(cursor) 实现。
    ps:SQL语句中使用的主语言程序变量简称为主变量,根据其作用的不同又可分为输入主变量和输出主变量


    为什么要使用游标

    👀SQL语言是面向集合的,一条SQL语句可以产生或处理多条记录;而主语言是面向记录的,一组主变量一次只能存放一条记录。
    所以仅仅使用主变量并不能完全满足SQL语句向应用程序输出数据的要求,为此嵌入式SQL引入了游标的概念,用来协调这两种不同的处理方式~
    游标是系统为用户开设的数据缓冲区,存放SQL语句的执行结果,每个游标区都有一个名字。
    用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理~


    使用游标的SQL语句

    一般情况下,SELECT语句查询结果是多条记录,因此需要用游标机制将多条记录一次一条地送给主程序处理,从而把对集合的处理转换为对单个记录的处理
    使用游标的步骤:
    (1)说明游标
    DECLARE语句为一条SELECT语句定义游标:

    EXEC SQL DECLARE<游标名> CURSOR FOR <SELECT 语句>;
    

    ps:定义游标仅仅是一条说明性语句, 这时关系数据库管理系统并不执行SELECT语句
    (2)打开游标
    用OPEN语句将定义的游标打开。

    EXEC SQL OPEN <游标名>;
    

    打开游标实际上是执行相应的SELECT语句,把查询结果取到缓冲区中。这时游标处于活动状态,指针指向查询结果集中的第一条记录
    (3)推进游标指针并取当前记录

    EXEC SQL FETCH <游标名>
    INTO <主变量>[<指示变量>][,<主变量>[<指示变量>]]...;
    

    其中主变量必须与SELECT语句中的目标列表达式具有一一对应关系。
    FETCH语句把游标指针向前推进一条记录,同时将缓冲区中的当前记录取出来送至主变量供主语言进一步处理。通过循环执行FETCH语句逐条取出结果集中的行进行处理。
    (4)关闭游标
    用CLOSE语句关闭游标,释放结果集占用的缓冲区及其他资源。

    EXEC SQL CLOSE <游标名>;
    

    游标被关闭后就不再和原来的查询结果集相联系。但被关闭的游标可以再次被打开,与新的查询结果相联系。
    🌟来看实例:

    IF (exists (select * from sys.objects where name = 'proc_cursor'))
        DROP PROCEDURE proc_cursor
    GO
    CREATE PROCEDURE proc_cursor --创建存储过程
    AS
    DECLARE @Sno char(9) --定义变量
    DECLARE @Sname char(20) --定义变量
     
    DECLARE mycursor CURSOR FOR select Sno, Sname from Student --声明游标
     
    OPEN mycursor  --打开游标
     
    FETCH NEXT FROM mycursor INTO @Sno, @Sname
     
    WHILE(@@FETCH_STATUS = 0)  --遍历所有的数据,@@FETCH_STATUS函数返回值为0表示FETCH语句执行成功
    BEGIN
    	PRINT '游标成功取出一条数据:'
    	PRINT @Sno
    	PRINT @Sname
    	PRINT '-----------------------'
    	FETCH NEXT FROM mycursor INTO @Sno, @Sname  --取下一条游标数据
    END
     
    CLOSE mycursor --关闭游标
     
    DEALLOCATE mycursor --删除游标
    GO
     
    EXEC proc_cursor
    GO
    

    ps:一些 Transact-SQL 系统函数的名称以两个 at 符号 (@@) 开头。 尽管在旧版 SQL Server 中,@@函数称为全局变量,但它们不是变量,不具有等同于变量的行为。 @@函数是系统函数,语法遵循函数规则。详细可参考:变量 (Transact-SQL)
    在这里插入图片描述
    这是Student表,对照着看下面的执行结果~
    在这里插入图片描述
    可以看到查询结果集合中的记录被一条一条地输出了,达到了我们的目的👏


    那,数据库SQL语句中CURSOR(游标)的简单使用 就介绍完啦,感谢阅读~😊
    如文中有不恰当的地方,望提出指正~

    展开全文
  • 数据库游标使用

    千次阅读 2013-01-02 16:00:42
    下面我就以一个实际例子给大家说一下我们为什么要游标、什么时候用、怎么用。 实例:某学校有多个班级,而每个班级里有多个学生。现在我们要完成这样一件事,假如有一天,这个学校不存在了,那么属于这个学校的...
    说道游标,我想大家并不陌生。但对于我们大多数初学者来说,就未必用过游标了。下面我就以一个实际例子给大家说一下我们为什么要用游标、什么时候用、怎么用。

    实例:某学校有多个班级,而每个班级里有多个学生。现在我们要完成这样一件事,假如有一天,这个学校不存在了,那么属于这个学校的班级也就不存在了,同理,这些班里的学生也就不再属于这个班了。

    需求明白了,我们开始建表,表结构如下:

    注:IsAvailable字段值为否时标明该条记录不存在。

    为了实现上述功能,我们决定用触发器,于是在School表中建立触发器,具体语句如下:

    CREATE TRIGGER [dbo].[UpdateClass]
       ON  [dbo].[School]
       AFTER UPDATE
    AS
    DECLARE
        @schoolID INT,--学校ID
        @isAvailable CHAR(2)--是否可用
    BEGIN
        --查询出更新记录的SchoolID和IsAvailable字段值
        SELECT @schoolID=SchoolID, @isAvailable=IsAvailable FROM inserted
    
        --如果更新的是isAvailable并且更新后的字段值是否
        if (UPDATE(isAvailable) and @isAvailable = '否')
            --标示该学校所有班级不可用(班级表中IsAvailable字段值为否)
            UPDATE Class SET IsAvailable='否' WHERE SchoolID=@schoolID
    END

    Class表中建立如下触发器
    CREATE TRIGGER [dbo].[UpdateStudent]
       ON  [dbo].[Class]
       AFTER UPDATE
    AS
    DECLARE
        @classID INT,--班级ID
        @isAvailable CHAR(2)--是否可用
    BEGIN
        --查询出更新记录的ClassID和IsAvailable字段值
        SELECT @classID=ClassID, @isAvailable=IsAvailable FROM inserted
    
        --如果更新的是isAvailable并且更新后的字段值是否
        IF (UPDATE(isAvailable) and @isAvailable = '否')
            --更新该班级下的所有学生IsAvailable字段值为否
            UPDATE Student SET IsAvailable='否' WHERE ClassID=@classID
    END

    Perfect,到此为止,我们的工作貌似要结束了,插入如下数据,测试一下。

    执行假删除语句:

    UPDATE School SET IsAvailable='否' WHERE SchoolID = 1
    结果如下:

    分析:从结果可以看出,我们的设计逻辑没有任何问题。两个触发器也被触发了,可结果为何不是我们想要的呢?仔细分析你会发现Class表下的触发器执行了,但是貌似只执行了一次,这就是问题所在之处。那么我们怎么能让每一条更新语句都触发更新触发器呢?此时,咱们今天的主角就要登场了,下面有请“游标”先生闪亮登场。

    下面我将直接修改School表下的触发器,里面将用到游标,并附有详细的注释,相信你会看懂的。

    School表下修改后的触发器代码:
    ALTER TRIGGER [dbo].[UpdateClass]
       ON  [dbo].[School]
       AFTER UPDATE
    AS
    DECLARE
        @schoolID INT,--学校ID
        @ClassID INT,--班级ID
        @isAvailable CHAR(2)--是否可用
    BEGIN
        --查询出更新记录的SchoolID和IsAvailable字段值
        SELECT @schoolID=SchoolID, @isAvailable=IsAvailable FROM inserted
    
        --如果更新的是isAvailable并且更新后的字段值是否
        IF (UPDATE(isAvailable) AND @isAvailable = '否')
            BEGIN
                --声明游标(集合为删除学校下的班级ID)
                DECLARE ClassCursor CURSOR FOR  
                SELECT ClassID FROM Class WHERE SchoolID = @schoolID
                
                --打开游标
                OPEN ClassCursor
                --当游标被打开时,行指针将指向该游标集第1行之前。
                --如果要读取游标集中的第1行数据,必须移动行指针使其指向第1行。
                FETCH NEXT FROM ClassCursor INTO @ClassID   --给变量赋初始值(游标中第一行数据)
    
                --每执行一个FETCH操作之后,查看一下全局变量@@FETCH_STATUS中的状态值,以此判断FETCH操作是否成功。
                --变量@@FETCH_STATUS有三种状态值:
                --  0  表示成功执行FETCH语句。
                -- -1  表示FETCH语句失败,例如移动行指针使其超出了结果集。
                -- -2  表示被提取的行不存在。
                WHILE @@FETCH_STATUS=0 --语句执行成功
                    BEGIN
                        --标识该学校所有班级不可用(班级表中IsAvailable字段值为否)
                        UPDATE Class SET IsAvailable='否' WHERE ClassID=@ClassID
    
                        --读取游标中下一条数据,并赋值给@ClassID
                        FETCH NEXT FROM ClassCursor INTO @ClassID
                    END
    
                --关闭并释放游标
                CLOSE ClassCursor  
                DEALLOCATE ClassCursor
            END
    END
    当我们再次执行删除学校操作时,你会发现问题完美解决了。结果如下:


    到此为止,我相信大家应该清楚为何用游标、什么时候用、怎么用这三个问题了。希望对大家有帮助。

    展开全文
  • 数据库基础--游标

    千次阅读 2013-11-30 13:00:03
    为什么使用游标 在开发数据库应用程序时,经常需要使用 SELECT 语句查询数据库,查询返回的数据存放在结果集中。用户在得到结果集后,需要逐行逐列的获取其中存储的数据,从而在应用程序中使用这些值。本讲所介绍的...
  • 1、为什么要使用游标 程序语言是面向记录的,一组变量一次只能存放一个变量或者一条记录,无法直接接收数据库中的查询结果集。为了更好的满足SQL语句向应用程序输出数据的需求,引入了游标的概念,用游标来协调这两...
  • 1)以python连接mysql数据库为例 2)使用游标的操作步骤 首先,使用pymysql连接上mysql数据库,得到一个数据库对象。 然后,我们必须开启数据库中的游标功能,得到一个游标对象。 接着,使用游标对象中的...
  • MySQL 使用游标

    2020-04-19 10:20:38
    为什么要使用游标:MySQL检索的操作一般都是返回结果集,使用简单的SELECT语句,但是却没有办法得到第一行、下一行,或每次一行地处理。有时候需要在检索出来的行中前进或后退一行或多行。 游标的介绍:游标是一个...
  • 1、什么是游标?一张图讲述游标的功能:图示说明:2、使用游标的好处?如果不使用游标功能,直接使用...3、利用python连接数据库,经常会使用游标功能1)以python连接mysql数据库为例2)使用游标的操作步骤首先,使用...
  • 数据库游标学习记录

    2018-07-19 17:23:33
    一、游标的定义:游标是一个容器,用来记录查询结果集的,本质是一块内存,如果不释放,就会占用内存,这就是为什么open之后还要close操作。 二、游标的优缺点: 1.优点:游标的一个常见用途就是保存查询结果,...
  • 什么游标?(转)

    2021-04-17 14:52:25
    使用游标功能后,我们可以将得到的结果先保存起来,然后可以随意进行自己的编程,得到我们最终想的结果集。 3、利用python连接数据库,经常会使用游标功能 1)以python连接mysql数据库为例 2)使用游标的操作...
  • MySQL5 中添加了存储过程的支持。  大多数SQL语句都是针对一个或多个表的单条语句。... 为什么要使用存储过程:优点 1 通过把处理封装在容易使用的单元中,简化复杂的操作。 2 由于不要求反复建
  • 使用游标功能后,我们可以将得到的结果先保存起来,然后可以随意进行自己的编程,得到我们最终想的结果集。 3、利用python连接数据库,经常会使用游标功能 1)以python连接mysql数据库为例 2)使...
  • SQL Server游标使用

    2019-06-25 10:26:02
    1.为什么要使用游标: 使用游标(cursor)的一个主要的原因就是把集合操作转换成单个记录处理方式。用SQL语言从数据库中检索数据后,结果放在内存的一块区域中,且结果往往是一个含有多个记录的集合。游标机制允许...
  • 游标使用

    2006-03-10 15:14:00
    为什么要用到游标 在某些PowerBuilder应用程序的开发中,您可能根本用不到游标这样一个对象。因为在其它工具开发中很多需用游标实现的工作,在PowerBuilder中却已有DataWindow来代劳了。事实上,D
  • 游标使用

    2007-09-24 13:59:00
    为什么要用到游标 在某些PowerBuilder应用程序的开发中,您可能根本用不到游标这样一个对象。因为在其它工具开发中很多需用游标实现的工作,在PowerBuilder中却已有DataWin-dow来代劳了。事实上,DataWi
  • 游标

    2007-07-17 12:29:00
    游标使用 ...为什么要用到游标 在某些PowerBuilder应用程序的开发中,您可能根本用不到游标这样一个对象。因为在其它工具开发中很多需用游标实现的工作,在PowerBuilder中却已有DataWin-dow来...
  • 二、为什么使用游标?     三、如何声明游标?   declare 游标名称 游标类型 insensitive(不敏感):将游标相关的结果集进行复制,放在临时表中,操作时是从临时表中提取,修改不受影响。 scroll(从...
  • mysql游标使用

    千次阅读 2016-01-23 13:33:41
    mysql被oracle收购后,从mysql-5.5开始,将InnoDB作为默认存储引擎,...使用mysql做为数据库的话,将来程序员肯定写很多,存储过程,function等。在写些东东的时候,游标肯定是少不了的。下面简单简介一下。 一,什么
  • 关于pb游标使用

    2010-08-19 09:58:47
    为什么要用到游标 在某些PowerBuilder应用程序的开发中,您可能根本用不到游标这样一个对象。因为在其它工具开发中很多需用游标实现的工作,在PowerBuilder中却已有DataWin-dow来代劳了。事实上,D...
  • 简单的游标

    2016-12-04 22:31:52
    为什么要用到游标呢?因为我们都知道,在pl/sql 中,每次只能返回单行的数据,当返回多行时,数据库会报错,所以,游标就诞生了。那游标又是如何做得到呢?原来,游标类似于指针一样,他可以逐行的读取sql,然后输出...
  • SQL SERVER 游标使用

    2017-06-06 22:16:55
    SQL Server基础之游标下面是我自己的应用场景……有个需求,需要把数据库表里面某一个字段的值设随机不重复的值。表是这样的:这是一个爬虫抓取网址表。其中 CatchOrder 这一列就是修改的列。CatchOrder 表示的...
  • 为什么要使用存储过程 1、通过把处理封装在容易使用的单元中,简化复杂的操作(正如前面例子所述)。 2、由于不要求反复建立一系列处理步骤,这保证了数据的完整性。如果所有开发人员和应用程序都使用同一(试验和...
  • 为什么要使用存储过程?理由如下: 可以通过把处理封装在容易使用的单元中,简化复杂的操作。 由于不要求反复建立一系列的处理步骤,这保证了数据的完整性。 简化对变动的管理。如果表名、列名或业务逻辑有变化,...
  • sql server 游标

    2016-05-06 14:45:00
    但是其实很多使用游标的代码中,是不需要使用游标的,我们可以通过WHILE循环、表变量、临时表、子查询等等的方式来实现相同的功能。但是如果实在没办法了,那就用游标吧。  首先还是看看什么是游标。游标是系统...

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 170
精华内容 68
关键字:

数据库为什么要使用游标