精华内容
下载资源
问答
  • MSSQL数据库游标

    2011-09-01 16:37:07
    数据库游标平时的比较少,今天就用到了,临时查了点资料,大概弄懂了,跟大家分享下游标,如果有什么说的不对的,大家积极批评指正。 游标:  就把它理解为SQL里面的指针吧,它指向一个查询的结果集,并返回一...
     
    

     数据库游标平时用的比较少,今天就用到了,临时查了点资料,大概弄懂了,跟大家分享下游标,如果有什么说的不对的,大家积极批评指正。

    游标:

        就把它理解为SQL里面的指针吧,它指向一个查询的结果集,并返回一条记录

    应用场合:

         有时候我们需要对一个结果集的每条记录进行相同或者不同的处理,如果没有游标就只有用where来限制查询只返回一条记录,然后一条条处理,累..

    这时可以用游标了

    适用游标的5个步骤:、

    1.创建游标declare

    2.打开游标open

    3.使用游标fetch

    4.关闭游标(关闭了还可以再打开)close cursor

    5.释放游标 deallocate cursor

    Code:

     

    --游标
    --定义存储游标数据的变量
    declare @id int
    declare @names nvarchar(20)
    declare @pwd varchar(20)
    declare @count int
    set @count=10
    --创建游标
    declare youbiao cursor for select * from jss
    --打开游标
    open youbiao
    --循环读取游标值
    while(@count>0)
      begin
      fetch next from youbiao into @id,@names,@pwd
      select @id as '自动增长',@names as '用户名',@pwd as '密码'
      set @count=@count-1
      end
    close youbiao--关闭游标
    
    open youbiao
    fetch next from youbiao into @id,@names,@pwd
      select '再次打开游标',@id as '游标中的值'
    deallocate youbiao--释放游标


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

    千次阅读 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
    当我们再次执行删除学校操作时,你会发现问题完美解决了。结果如下:


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

    展开全文
  • 因为cursor只能一次,即每完一次之后记录其位置,等到下次再取的时候是从游标处再取而不是从头再来,而且fetch完所有的数据之后,这个cursor将不再有使用价值了,即不再能fetch到数据了。 数据库支持 使用简单的...
  • cursor就是一个Cursor对象,这个cursor是一个实现了迭代器(def__iter__())和生成器(yield)的MySQLdb对象,这个时候cursor中还没有数据,只有等到fetchone()或fetchall()的时候才返回一个元组tuple,才支持len()...

    cursor就是一个Cursor对象,这个cursor是一个实现了迭代器(def__iter__())和生成器(yield)的MySQLdb对象,这个时候cursor中还没有数据,只有等到fetchone()或fetchall()的时候才返回一个元组tuple,才支持len()和index()操作,这也是它是迭代器的原因。但同时为什么说它是生成器呢?因为cursor只能用一次,即每用完一次之后记录其位置,等到下次再取的时候是从游标处再取而不是从头再来,而且fetch完所有的数据之后,这个cursor将不再有使用价值了,即不再能fetch到数据了。

    数据库支持

    使用简单的纯文本只能实现有退限的功能,所需要引入数据库,完成更强大的功能,本节使用的简单数据库SQLite 。

    SQLite 和PySQLite

    sqlite是非常著名的开源嵌入式数据库软件,它可以嵌入到其他程序中使用,并且提供SQL接口用来查询,非常方便。它的官方站点为http://www.sqlite.org。

    而pysqlite 则是一个sqlite 为 python 提供的 api 接口,它让一切对于 sqlite 的操作都变得异常简单

    在python2.5版本这后,SQLite的优势在于它的一个包装(PySQLite)已经被包括在标准库内,所以我们可以直接使用。

    入门操作

    可以将SQLite作为名为sqlite3的模块导入。之后就可以创建一个到数据库文件的连接----如果文件不存在就会被创建----通过提供一个文件名:

    import sqlite3
    conn= sqlite3.connect(‘somedatabase.db’) # 创建数据库
    cu =conn.cursor() #能获得连接的游标

    #创建数据表

    cu.execute(""“create table catalog (
    id integer primary key,
    pid integer,
    name varchar(10) UNIQUE
    )”"")

    #插入两条数据

    cu.execute(“insert into catalog values(0,0,‘name1’)”)
    cu.execute(“insert into catalog values(1,0,‘name2’)”)
    conn.commit()

    #选择(select)

    cu.execute(“select * from catalog”)
    cu.fetchall()
    [(0, 0, ‘name1’), (1, 0, ‘name2’)]

    cu.execute(“select * from catalog where id = 1”)
    cu.fetchall()
    [(1, 0, ‘name2’)]

    #修改(update)

    cu.execute(“update catalog set name=’name2′ where id = 0″)
    cx.commit()
    cu.execute(“select * from catalog”)
    cu.fetchone()
    (0, 0, ‘name2′)

    #删除(delete)

    cu.execute(“delete from catalog where id= 1″)
    cx.commit()
    cu.execute(“select * from catalog”)
    cu.fetchall()
    [(0, 0, ‘name2’)]
    连接

    为了使用基础数据库系统,首先必须连接到它,这个时候需要使用具有名称的connect函数,该函数有多个参数,而具体用哪个参数取决于数据库。

    connect函数的常用参数:

    connect函数返回连接对象。这个对象表示目前和数据库的会话。连接对象支持的方法如下;

    连接对象方法:

    commit 方法总是可用的,但如果数据库不支持事务,它就没有任何作用。如果关闭了连接但还有未提交的事务,它们会隐式地回滚—但是只有在数据库支持持回滚的时候才可以。

    rollback 方法可能不可用,因为不是所有的数据库都支持事务(事务是一系列动作)。如果可用,那么就可以“撤销”所有未提交的事务。

    cursor 方法将我们引入另外一个主题:游标对象。通过游标扫行SQL 查询并检查结果。游标连接支持更多的方法,而且可能在程序中更好用。

    游标:

    cu = conn.cursor()
    能获得连接的游标,这个游标可以用来执行SQL查询。

    conn.commit()
    完成插入并且做出某些更改后确保已经进行了提交,这样才可以将这些修改真正地保存到文件中。

    游标对象方法:

    游标对象特性:

    cu.fetchone()
    fetchall()返回结果集中的全部数据,结果为一个tuple的列表。每个tuple元素是按建表的字段顺序排列。注意,游标是有状态的,它可以记录当前已经取到结果的第几个记录了,因此,一般你只可以遍历结果集一次。在上面的情况下,如果执行fetchone()会返回为空。这一点在测试时需要注意。

    conn.close()
    可以在每次修改数据库后都进行提交,而不是仅仅在准备关闭才提交,准备关闭数据时,使用close 方法。

    最后,小编想说:我是一名python开发工程师,整理了一套最新的python系统学习教程,想要这些资料的可以关注私信小编“01”即可(免费分享哦)希望能对你有所帮助

    展开全文
  • cursor就是一个Cursor对象,这个cursor是一个实现了迭代器(def__iter__())和生成器(yield)的MySQLdb对象,这个时候cursor中还没有数据,只有等到fetchone()或fetchall()的时候才返回一个元组tuple,才支持len()...

    cursor就是一个Cursor对象,这个cursor是一个实现了迭代器(def__iter__())和生成器(yield)的MySQLdb对象,这个时候cursor中还没有数据,只有等到fetchone()或fetchall()的时候才返回一个元组tuple,才支持len()和index()操作,这也是它是迭代器的原因。但同时为什么说它是生成器呢?因为cursor只能用一次,即每用完一次之后记录其位置,等到下次再取的时候是从游标处再取而不是从头再来,而且fetch完所有的数据之后,这个cursor将不再有使用价值了,即不再能fetch到数据了。

    数据库支持

    使用简单的纯文本只能实现有退限的功能,所需要引入数据库,完成更强大的功能,本节使用的简单数据库SQLite 。

    SQLite 和PySQLite

    sqlite是非常著名的开源嵌入式数据库软件,它可以嵌入到其他程序中使用,并且提供SQL接口用来查询,非常方便。它的官方站点为http://www.sqlite.org。

    而pysqlite 则是一个sqlite 为 python 提供的 api 接口,它让一切对于 sqlite 的操作都变得异常简单

    在python2.5版本这后,SQLite的优势在于它的一个包装(PySQLite)已经被包括在标准库内,所以我们可以直接使用。

    入门操作

    可以将SQLite作为名为sqlite3的模块导入。之后就可以创建一个到数据库文件的连接----如果文件不存在就会被创建----通过提供一个文件名:

    '''
    遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 
    寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
    '''
    >>> import sqlite3
    >>> conn= sqlite3.connect('somedatabase.db') # 创建数据库
    >>>cu =conn.cursor()   #能获得连接的游标
    
    #创建数据表
    >>>cu.execute("""create table catalog (
        id integer primary key,
        pid integer,
        name varchar(10) UNIQUE
       )""")
    
    #插入两条数据
    >>>cu.execute("insert into catalog values(0,0,'name1')")
    >>>cu.execute("insert into catalog values(1,0,'name2')")
    >>>conn.commit()
    
    #选择(select)
    >>>cu.execute("select * from catalog")
    >>>cu.fetchall() 
    [(0, 0, 'name1'), (1, 0, 'name2')]
    >>>cu.execute("select * from catalog where id = 1")
    >>>cu.fetchall()
    [(1, 0, 'name2')]
    
    #修改(update)
    >>>cu.execute(“update catalog set name=’name2′ where id = 0)
    >>> cx.commit()
    >>> cu.execute(“select * from catalog”)
    >>> cu.fetchone()
    (0, 0, ‘name2′)
    
    #删除(delete)
    >>>cu.execute(“delete from catalog where id= 1)
    >>> cx.commit()
    >>> cu.execute(“select * from catalog”)
    >>> cu.fetchall()
    [(0, 0, 'name2')]
    

    连接

    为了使用基础数据库系统,首先必须连接到它,这个时候需要使用具有名称的connect函数,该函数有多个参数,而具体用哪个参数取决于数据库。

    connect函数的常用参数:

    connect函数返回连接对象。这个对象表示目前和数据库的会话。连接对象支持的方法如下;

    连接对象方法:

    commit 方法总是可用的,但如果数据库不支持事务,它就没有任何作用。如果关闭了连接但还有未提交的事务,它们会隐式地回滚—但是只有在数据库支持持回滚的时候才可以。

    rollback 方法可能不可用,因为不是所有的数据库都支持事务(事务是一系列动作)。如果可用,那么就可以“撤销”所有未提交的事务。

    cursor 方法将我们引入另外一个主题:游标对象。通过游标扫行SQL 查询并检查结果。游标连接支持更多的方法,而且可能在程序中更好用。

    游标:

    cu = conn.cursor()
    

    能获得连接的游标,这个游标可以用来执行SQL查询。

    conn.commit()
    

    完成插入并且做出某些更改后确保已经进行了提交,这样才可以将这些修改真正地保存到文件中。

    游标对象方法:

    游标对象特性:

    cu.fetchone()
    

    fetchall()返回结果集中的全部数据,结果为一个tuple的列表。每个tuple元素是按建表的字段顺序排列。注意,游标是有状态的,它可以记录当前已经取到结果的第几个记录了,因此,一般你只可以遍历结果集一次。在上面的情况下,如果执行fetchone()会返回为空。这一点在测试时需要注意。

    conn.close()
    

    可以在每次修改数据库后都进行提交,而不是仅仅在准备关闭才提交,准备关闭数据时,使用close 方法。

    展开全文
  • SQL Server 游标

    2020-05-25 17:31:03
    游标什么是游标为什么用游标在哪里用游标怎么用游标 什么是游标 游标(Cursor)是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次一行或者多行前进或向后浏览数据的能力。可以把...
  • oracle游标

    2019-10-05 08:08:24
    一.什么是游标 CCL: Cursor Control Langage 游标控制语句 游标: 指向数据库结果集的一个指针,类似于 Iterator 使用游标 查询结果集,游标指向的是...什么时候用游标 如果查出来的记录 只有一条 可以直接 select...
  • 今天同事问我一个问题:他需要每天将tableA中指定条件下的数据copy到tableB中,并删除tableB中已被copy的数据,应该用什么方法高效一些?听到这个方法之后第一反映就是想到在我上家公司的时候,也做了同样的数据备份...
  • sql server 游标

    2016-05-06 14:45:00
    今天研究一下罪恶的游标,说它罪恶,是因为它打破了关系型数据库面向集合的思想,迫使我们用行的方式思考,而且其实现方式...但是如果实在没办法了,那就用游标吧。  首先还是看看什么是游标。游标是系统为用户...
  • 这也是为什么游标是邪恶的,它会使开发人员变懒,懒得去想面向集合的查询方式实现某些功能. 同样的,在性能上,游标会吃更多的内存,减少可用的并发,占用宽带,锁定资源,当然还有更多的代码量…… 从游标对...
  • sql server 2000 游标错误

    2008-08-28 16:55:18
    今天在整合spring,hibernate,struts2的时候 报了一个"sql server 2000 游标错误"错误 ...发现数据库的表名了关键字user 把表明换了一下就好了 但是我不明白为什么会报游标错误??...
  • 因为cursor只能一次,即每完一次之后记录其位置,等到下次再取的时候是从游标处再取而不是从头再来,而且fetch完所有的数据之后,这个cursor将不再有使用价值了,即不再能fetch到数据了。 数据库支持 使用简单的...
  • 存储过程及游标的优缺点

    千次阅读 2018-11-23 17:18:57
    前言:相信很多小伙伴在学习阶段肯定使用过存储过程及游标。但是进入企业工作几年发现,实际的项目中很少使用存储过程和游标。...对于复杂的业务逻辑,因为在存储过程创建的时候数据库已经对其进行了一...
  • 绑定变量和游标共享

    2018-10-24 19:58:55
    变量绑定是OLTP系统中一个非常值得关注的技术点。...在介绍绑定变量以前,首先要介绍一下sql究竟是如何被执行的,知道了sql执行的具体细节之后,才能讨论为什么以及什么时候要做变量绑定。 当一个...
  • 1.什么时候会用到 2.具体怎么 2.1安装pymsql 2.2连接数据库 2.2.1-连接数据库 2.2.2-获取游标: 2.3操作数据库 2.3.1-执行sql的方法 2.3.2-建表操作 2.3.3-查询操作 2.3.4-更新操作 2.3.5-删除操作 ...
  • 这里,我总结了在数据库上,SQL语言对数据排序、过滤和分组,以及表、视图、联结、子查询、游标、存储过程和触发器等内容。 数据库相关 查所有数据库 show databases; 创建数据库 create database 数据库名; 查看...
  • 其实主要看你是使用什么连接的数据库,如果没有连接池的话,那么就不需要,因为当你关闭Connection( conn.close)时GC会帮你关闭ResultSet 和Statement ; 但是当你使用连接池的时候就会出现异常,因为关闭...
  • 1、问题:简单查询数据库用户表中的用户ID,用户表比较大,有一千多万条记录,Mysql查询select uid as 用户ID from ucenter.usr_user 即可解决,但是Python调用Pymysql链接数据库查询的时候非常慢,等了十分钟也...
  • 但不知道为什么游标老是超出,希望有人解答! [b]问题补充:[/b] 程序有些地方使用了HibernateTemplate这个,但因为存在一些复杂SQL的组装只想知道上面这种写法会不会关掉游标的. [b]问题补充:[/b] 不是使用spring的...
  • 1.什么时候会用到 2.具体怎么 2.1安装pymsql 2.2连接数据库 2.2.1-连接数据库: 2.2.2-获取游标: 2.3操作数据库 2.3.1-执行sql的方法 2.3.2查询操作 2.3.3-更新操作 2.3.4-删除操作 2.3.5-插入操作 1....
  • 数据库总结(Mysql)

    2019-02-12 09:45:22
    目录 一、基本概念 1.主键、外键、超键、候选键 2.为什么自增列作为主键 3.触发器的作用?...什么来调用?...10.什么是临时表,临时表什么时候删除? 11.非关系型数据库和关系型数据库区别,优势...
  • 数据库常见面试题一一、基本概念1.主键、外键、超键、候选键1.1、主键、外键的作用?2.为什么自增列作为主键3....什么是临时表,临时表什么时候删除?11.非关系型数据库和关系型数据库区别,优势比较?12.数...
  • 数据库基础知识点一一、...什么是临时表,临时表什么时候删除?12.非关系型数据库和关系型数据库的区别与优势13.数据库范式,根据某个场景设计数据表?14.什么是内连接、外连接、交叉连接、笛卡尔积等?15.varchar和char
  • 1.什么时候会用到 2.具体怎么 2.1安装pymsql 2.2连接数据库 2.2.1-连接数据库: 2.2.2-获取游标: 2.3操作数据库 2.3.1-执行sql的方法 2.3.2-建表操作 2.3.3-查询操作 2.3.4-更新操作 2.3.5-删除操作 2.3.6-插入...
  • 达梦数据库_SQL语言手册.pdf 数据库快照定义语句 数据库快照删除语句 第章数据查询语句和全文检索语句 ...注:这个限制长度只针对建表的情况,在定义变量的时候,可以不受这个限制长度的限 制 数值数据类型

空空如也

空空如也

1 2 3 4 5 6
收藏数 118
精华内容 47
关键字:

数据库什么时候用游标