精华内容
下载资源
问答
  • cursor:hand 与 cursor:pointer 的效果是一样的,都像光标指向链接一样,光标变成手行。 cursor:hand :IE完全支持。但是在firefox是不支持的,没有效果。 cursor:pointer :是CSS2.0的标准。所以firefox是支持的,...
  • Mybatis光标 mybatis光标问题
  • CursorWindow对Cursor中的内容大小有限制,限制为1024*1024也就是1M,换句话说Cursor中数据的大小不能超过1M,如果超过1M会引发如下的错误: 代码如下:08-23 05:48:31.838: DEBUG/Cursor(1805): skip_rows row 14908...
  • The cursor render as a crosshair游标表现为十字准线 cursor: pointer; cursor: hand;写两个是为了照顾IE5,它只认hand。   手 The cursor render as a pointer (a hand) that indicates a link游标以暗示...
  • jQuery.cursor 当在comman上更改鼠标光标时,此插件尝试添加一些额外的功能。 当然,基本更改很容易,但是可以付诸实践。 最基本的用途 $.cursor(); // return current cursor style relative to document BODY $....
  • 游标 CURSOR

    千次阅读 2019-01-12 14:11:35
    游标 CURSOR 一、游标概述 游标(cursor)是数据库系统在内存中开设的一个数据缓冲区,存放SQL语句的执行结果。 每个游标都有一个名字,用户可以用SQL语句逐一从游标中获取记录,并赋给变量做进一步处理。 作用...

    游标 CURSOR
    一、游标概述
    游标(cursor)是数据库系统在内存中开设的一个数据缓冲区,存放SQL语句的执行结果。

    每个游标都有一个名字,用户可以用SQL语句逐一从游标中获取记录,并赋给变量做进一步处理。

    作用:用于定位结果集的行 和 遍历结果集。

    游标产生时间:当执行DML SQL语句时;

    游标用于存放:结果集

    游标有名字吗:有,SQL或用户给他取名

    游标如何操作:用FETCH语句逐一从游标中提取记录,并赋给变量进一步处理

    同时可打开几个游标:多个,具体数量由数据库初始化参数OPEN_CURSOR决定。

    二、游标分类
    游标分为:静态游标(隐式和显式)和REF游标(+游标变量)

    1. 游标的属性
      %FOUND SQL语句影响了一行或多行时为true;

    %NOTFOUND SQL语句没有影响任何行时为true(常用,没找到为T,就退出)

    %ROWCOUNT SQL语句影响的行数;

    %ISOPEN 游标是否打开,始终为false。

    1. 静态游标
      静态游标是指结果集已经确实(静态定义)的游标。

    静态游标分:隐式游标 和 显示游标。

    2.1 隐式游标
    在PL/SQL中隐式游标在执行DML SQL(Insert/Delete/Update/Select)语句时自动创建、自动声明、打开和关闭,其名SQL(注:所有的隐式游标名都叫“SQL”);

    示例:

    使用游标的属性。

    BEGIN
    
    UPDATE emp SET sal=5000 WHERE empno=7369;
    
    IF SQL%FOUND THEN
    
    DBMS_OUTPUT.PUT_LINE( ‘表已更新’ );
    
    END IF;
    
    END;
    

    提示:

    在Java中,如对表进行了增删改操作,结果会返回n,表示在数据库中多少行受影响。

    我们通过 n>0 或 n=0 来判断SQL代码是否执行成功。

    这个n 即SQL%ROWCOUNT属性。

    2.2 显示游标
    显示游标用于处理SELECT时返回多行的查询;

    增删改时不会用显示游标;

    显示游标需要手动的去做声明、打开、提取、关闭操作。

    示例:

    l 显示游标操作

    DECLARE
    
    --声明游标:划分存储区域,注意此时并没有执行Select语句。
    
    CURSOR c_name IS
    
    SELECT sal FROM emp WHERE empno=7369;
    
    my_sal emp.sal%TYPE;
    
    BEGIN
    
    --打开游标:执行select语句,获得结果集存到游标中,此时游标指向结果集头,而不是第一条记录。
    
    OPEN c_name;
    
    --提取记录:移动游标取一条记录
    
    FETCH c_name INTO my_sal;
    
    DBMS_OUTPUT.PUT_LINE(my_sal);
    
    --关闭游标:将游标放入缓冲池中,没有完全释放资源,可重新打开。
    
    CLOSE c_name;
    
    END;
    

    l 带参数的显示游标

    DECLARE
    
    CURSOR c_name( dno NUMBER ) IS
    
    SELECT * FROM emp WHERE deptno=dno;
    
    my_a emp%ROWTYPE;
    
    BEGIN
    
    OPEN c_name(10); --打开游标,并传值
    
    LOOP
    
    FETCH c_name INTO my_a;
    
    EXIT LOOP c_name%NOTFOUND;
    
    DBMS_OUTPUT.PUT_LINE( '名字:'||my_a.ename );
    
    END LOOP;
    
    CLOSE c_name;
    
    END;
    

    l For循环游标

    作用:简化游标处理代码(简化打开、提取、关闭)。

    基本语法:

    FOR r_index IN cursor_name LOOP

    ……

    END LOOP;

    示例:

    For循环游标操作

    DECLARE
    
    CURSOR c_name IS
    
    SELECT * FROM emp;
    
    BEGIN
    
    FOR i IN c_name LOOP
    
    DBMS_OUTPUT.PUT_LINE( i.ename||' '||i.job );
    
    END LOOP;
    
    END;
    

    注释:如同foreach语句一样,i默认为行类型(%rowtype),自动打开、提取、关闭。

    l 带参数的For循环游标

    DECLARE
    
    CURSOR c_name( dno number ) IS
    
    SELECT * FROM emp WHERE deptno=dno;
    
    BEGIN
    
    FOR i IN c_name(30) LOOP
    
    DBMS_OUTPUT.PUT_LINE( i.ename||' '||i.job );
    
    END LOOP;
    
    END;
    

    l 游标的嵌套问题

    固名思义,就是在游标中嵌套一个游标。

    示例:

    列出所有部门的人员信息。

    要求结果如下:

    部门号:10 部门名称:****

    编号:** 姓名:**

    编号:** 姓名:**

    ……

    部门号:20 部门名称:****

    编号:** 姓名:**

    编号:** 姓名:**

    ……

    分析:

    1.创建部门游标,先将部门信息列出来;

    2.在循环取部门信息时,再创建打开员工表游标,进行读取。

    代码:

    DECLARE

    CURSOR mydc IS
    
    SELECT * FROM dept;
    
    mydr dept%ROWTYPE;--声明dept部门表对象
    
    CURSOR myec(dno NUMBER) IS
    
    SELECT * FROM emp WHERE empno=dno;
    
    myer emp%ROWTYPE;--声明emp员工表对象
    
    BEGIN
    
    --先打开部门结果集游标
    
    OPEN mydc;
    
    LOOP
    
    FETCH mydc INTO mydr;
    
    EXIT LOOP mydc%NOTFOUND;--提取完退出LOOP
    
    DBMS_OUTPUT.PUT_LINE( '部门号:'||mydr.deptno||' 部门名称:'||mydr.dname );
    
    --再打开员工结果集游标,入部门编号
    
    OPEN myec(mydr.deptno);
    
    LOOP
    
    FETCH myec INTO myer;
    
    EXIT LOOP myec%NOTFOUND;
    
    DBMS_OUTPUT.PUT_LINE(' 编号:'||myer.empno||' 姓名:'||myer.ename);
    
    END LOOP;
    
    CLOSE myec;
    
    END LOOP;
    
    CLOSE mydc;
    
    END;
    

    –使用For循环简化

    DECLARE
    
    CURSOR mydc IS
    
    SELECT * FROM dept;
    
    CURSOR myec(dno number) IS
    
    SELECT * FROM emp WHERE empno=dno;
    
    BEGIN
    
    --遍历部门结果集游标
    
    FOR i INT mydc LOOP
    
    DBMS_OUTPUT.PUT_LINE( '部门号'||i.deptno||' 部门名称:'||i.dname );
    
    --遍历员工结果集游标,传下部门编号
    
    FOR j INT myec(i.detpno) LOOP
    
    DBMS_OUTPUT.PUT_LINE( ' 编号'||j.empno||' 姓名:'||j.ename );
    
    END LOOP;
    
    END LOOP;
    
    END;
    
    1. REF游标
      REF游标也叫动态游标,动态SQL执行时产生。

    REF游标更应该被称之为游标类型,而游标变量则为该类型的游标。

    3.1 创建REF游标+游标变量
    基本语法:

    –创建REF游标

    TYPE ref_cursor_name IS REF CURSOR

    [RETURN 返回类型];

    –声明REF游标变量

    游标变量 ref_cursor_name;

    示例:

    创建个REF游标类型

    TYPE ref_name IS REF CURSOR; --定义弱游标类型,名字叫ref_name
    
    c_name ref_name;
    

    3.2 REF游标分类
    强类型:带RETURN返回类型

    弱类型:不带RETURN返回类型

    相对来说,弱类型更为灵活。

    示例:

    声明强类型REF游标+游标变量

    DECLARE
    
    TYPE c_type IS REF CURSOR
    
    RETURN emp%ROWTYPE;
    
    c_name c_type;
    

    3.3 打开游标变量
    OPEN cursor_name FOR 查询结果集;

    示例:

    用REF游标+游标变量显示数据

    DECLARE
    
    TYPE my_t IS REF CURSOR
    
    RETURN emp%ROWTYPE; --声明一个游标类型
    
    myc my_t; --定义一个REF类型的游标变量
    
    myr emp%ROWTYPE;
    
    BEGIN
    
    OPEN myc FOR
    
    SELECT * FROM emp;
    
    LOOP
    
    FETCH myc INTO myr;
    
    EXIT WHEN myc%NOTFOUND;
    
    DBMS_OUTPUT.PUT_LINE(myr.ename);
    
    END LOOP;
    
    CLOSE myc;
    
    END;
    
    1. 标变量的优点和限制
      4.1 游标变量功能强大,可以简化数据处理;

    4.2 游标变量优点:

    a.可从不同的select语句中提取结果集;

    b.可以作为过程的参数进行传递;

    c.可以引用游标的所有属性;

    d.可以进行赋值运算;

    4.3 游标变量的限制:

    a.不能在程序包中声明游标变量;

    b.for update子句不能与游标变量一起使用;

    c.不能使用比较运算符。

    三、动态语句拼接 :n
    设定一个游标变量来执行动态的sql语句。

    数据库管理员、设计师常用的知识点。

    基本语法:

    OPEN 游标名 FOR ‘SELECT … >:1 …’;

    USEING 变量名;

    示例1:

    OPEN cursor_name FOR
    
    'SELECT * FROM emp WHERE sal>:1 ORDER BY sal DESC'
    
    USEING p_sal;
    

    解释:

    –设置占位符:sal>:1动态拼接(相当于JDBC中的?占位符)

    –填充占位符:将变量p_sal的值代入SELECT中“:1”位置处

    –如有多个动态拼接处,请设置:2,:3,……,同时using 后面变量用逗号分隔。

    示例2:

    DECLARE
    
    r_emp emp%ROWTYPE;
    
    --定义REF游标及游标变量
    
    TYPE c_type IS REF CURSOR;
    
    cur c_type;
    
    p_salary NUMBER;
    
    BEGIN
    
    p_salary := 2500;
    
    --打开游标
    
    OPEN cur FOR
    
    'select * from emp where sal>:1 order by sal desc'
    
    --填充占位符
    
    USING p_salary;
    
    DBMS_OUTPUT.PUT_LINE('薪水大于'|| p_salary ||'的员工有:');
    
    LOOP
    
    --提取游标中的数据到变量r_emp
    
    FETCH cur INTO r_emp;
    
    EXIT WHEN cur%NOTFOUND;
    
    DBMS_OUTPUT.PUT_LINE('编号:'|| r_emp.empno||'姓名:'||r_emp.ename||'薪水:'||r_emp.sal);
    
    END LOOP;
    
    --关闭游标
    
    CLOSE cur;
    
    END;
    
    展开全文
  • cursor的基本使用方法

    千次阅读 2021-02-27 18:55:35
    一、Cursor的分类二、各类Cursor举例----静态游标-显式游标setserveroutputondeclarecursoremp_sor(emp_deptnoinnumber)isselect*fromempwheredeptno=emp_deptno ;emp_i emp%rowtype;begindbms_output.put_line('...

    一、Cursor的分类

    e9293056579a15caf7a2944ef9058c9b.png

    二、各类Cursor举例

    ----

    静态游标

    -

    显式游标

    set

    serveroutput

    on

    declare

    cursor

    emp_sor(emp_deptno

    in

    number

    )

    is

    select

    *

    from

    emp

    where

    deptno=emp_deptno ;

    emp_i emp%

    rowtype

    ;

    begin

    dbms_output.put_line(

    'Getting emp from deptno 10'

    );

    open

    emp_sor(

    10

    );

    loop

    fetch

    emp_sor

    into

    emp_i;

    exit

    when

    emp_sor%

    notfound

    ;

    dbms_output.put_line(

    'Employee id '

    ||emp_i.empno||

    ' is:'

    );

    dbms_output.put_line(emp_i.ename);

    end

    loop

    ;

    close

    emp_sor;

    end

    ;

    /

    ----

    静态游标

    -

    隐式游标

    -1.DML

    begin

    update

    emp

    set

    ename=ename ;

    --where 1=2;

    dbms_output.put_line(

    'update '

    ||

    sql

    %

    rowcount

    ||

    ' records'

    );

    end

    ;

    /

    ----

    静态游标

    -

    隐式游标

    -2.loop for

    begin

    for

    r_sor

    in

    (

    select

    empno,ename

    from

    emp)

    loop

    dbms_output.put_line(r_sor.empno ||

    ' : '

    || r_sor.ename);

    end

    loop

    ;

    end

    ;

    /

    ----

    静态游标

    -

    隐式游标

    -3.select into

    declare

    v

    varchar2

    (

    20

    );

    begin

    select

    ename

    into

    v

    from

    emp

    where

    rownum =

    1

    ;

    dbms_output.put_line(v);

    dbms_output.put_line(

    sql

    %

    rowcount

    );

    end

    ;

    /

    ----

    动态游标

    -

    弱类型

    Declare

    type

    rc

    is

    ref

    cursor

    ;

    cursor

    c

    is

    select

    *

    from

    dual;

    l_cursor rc;

    begin

    if

    (to_char(

    sysdate

    ,

    'dd'

    ) =

    30

    )

    then

    open

    l_cursor

    for

    'select * from emp'

    ;-- ref cursor with dynamic sql

    elsif

    (to_char(

    sysdate

    ,

    'dd'

    ) =

    29

    )

    then

    open

    l_cursor

    for

    select

    *

    from

    dept;-- ref cursor with static sql

    else

    open

    l_cursor

    for

    select

    *

    from

    dual;-- with ref cursor with static sql

    end

    if

    ;

    open

    c;-- the "normal" static cursor

    end

    ;

    /

    ----

    动态游标

    -

    强类型

    declare

    type

    emp_job

    is

    record

    (empno

    number

    ,

    ename

    varchar2

    (

    20

    ),

    job

    varchar2

    (

    30

    )

    );

    type

    emp_refcur

    is

    ref

    cursor

    return

    emp_job;

    --

    声明

    REF CURSOR

    emp_sor emp_refcur;

    emp_iemp_job;

    begin

    open

    emp_sor

    for

    select

    empno,ename,job

    from

    emp

    where

    rownum <

    10

    order

    by

    1

    ;

    loop

    fetch

    emp_sor

    into

    emp_i;

    exit

    when

    emp_sor%

    notfound

    ;

    dbms_output.put_line(emp_i.ename ||

    '''s job is :'

    );

    dbms_output.put_line(emp_i.job);

    end

    loop

    ;

    close

    emp_sor;

    end

    ;

    /

    普通cursor与REF cursor的区别:

    1)静态cursor不能返回到客户端,只有PL/SQL才能利用它。refcursor能够被返回到客户端,这就是从Oracle的存储过程返回结果集的方式。

    2)静态cursor可以是全局的,而refcursor则不是。

    3)refcursor可以从子例程传递到子例程,而cursor则不能。为了共享静态cursor,必须在包说明或包体中把它定义为全局cursor。

    因为使用全局变量通常不是一种很好的编码习惯,因此可以用refcursor来共享PL/SQL中的cursor,无需混合使用全局变量。

    4)使用静态cursor,通过静态SQL(但不用refcursor),比使用refcursor效率高,而refcursor的使用仅限于以下几种情况:

    1.把结果集返回给客户端;

    2.在多个子例程之间共享cursor(实际上与上面提到的一点非常类似);

    3.没有其他有效的方法来达到你的目标时,则使用refcursor,正如必须用动态SQL时那样

    ----

    动态游标

    -sys_refcursor

    DECLARE

    TYPE

    mytable

    IS

    TABLE

    OF

    emp%

    ROWTYPE

    ;

    l_data mytable;

    l_refc

    sys_refcursor

    ;

    BEGIN

    OPEN

    l_refc

    FOR

    SELECT

    empno,ename,job,mgr,hiredate,sal,comm,deptno

    FROM

    emp;

    FETCH

    l_refc

    BULK

    COLLECT

    INTO

    l_data;

    CLOSE

    l_refc;

    FOR

    i

    IN

    1

    .. l_data.COUNT

    LOOP

    DBMS_OUTPUT.put_line ( l_data(i).ename ||

    ' was hired since '

    || l_data (i).hiredate );

    END

    LOOP

    ;

    END

    ;

    非强类型的Ref cursor 和sys_refcursor的区别:

    A REF CURSOR that does not specify the return type such as SYS_REFCURSOR. Meaning the SYS_REFCURSOR can be opened for a dynamic SQL query, where as simple REF CURSOR can not be opened for a query dynamically built at execution time.

    三、游标属性

    /*************************************************************

    游标属性:

    %FOUND

    :变量最后从游标中获取记录的时候,在结果集中找到了记录。

    %NOTFOUND

    :变量最后从游标中获取记录的时候,在结果集中没有找到记录。

    %ROWCOUNT

    :当前时刻已经从游标中获取的记录数量。

    %ISOPEN

    :是否打开。

    **************************************************************/

    ----

    静态游标

    -

    游标属性

    Declare

    Cursor

    emp_sor

    is

    Select

    *

    from

    emp

    where

    rownum<

    6

    order

    by

    1

    ;

    emp_i emp%

    rowtype

    ;

    num

    number

    :=

    1

    ;

    Begin

    Open

    emp_sor;

    Fetch

    emp_sor

    into

    emp_i;

    Loop

    If

    emp_sor%

    found

    then

    Dbms_output.put_line(

    'Looping over record '

    ||num||

    ' of '

    || emp_sor%

    rowcount

    );

    Fetch

    emp_sor

    into

    emp_i;

    num := num +

    1

    ;

    Elsif

    emp_sor%

    notfound

    then

    Exit

    ;

    ---exit loop, not IF

    End

    if

    ;

    End

    loop

    ;

    If

    emp_sor%

    isopen

    then

    Close

    emp_sor;

    End

    if

    ;

    End

    ;

    /

    展开全文
  • Mybatis源码-cursor(游标)

    千次阅读 2019-07-27 21:04:42
    今天学习一下cursor包的下源码,了解mybatis大致游标实现 目录1、Cursor(游标接口类)1.1源码1.2总结2、DefaultCursor(默认游标实现类)2.1、源码2.2、总结 1、Cursor(游标接口类) 1.1源码 /** * Copyright 2009-...

    今天学习一下cursor包的下源码,了解mybatis大致游标实现

    1、Cursor(游标接口类)

    1.1源码

    /**
     *    Copyright 2009-2019 the original author or authors.
     *
     *    Licensed under the Apache License, Version 2.0 (the "License");
     *    you may not use this file except in compliance with the License.
     *    You may obtain a copy of the License at
     *
     *       http://www.apache.org/licenses/LICENSE-2.0
     *
     *    Unless required by applicable law or agreed to in writing, software
     *    distributed under the License is distributed on an "AS IS" BASIS,
     *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     *    See the License for the specific language governing permissions and
     *    limitations under the License.
     */
    package org.apache.ibatis.cursor;
    
    import java.io.Closeable;
    
    /**
     * 这个游标通过迭代器来获取一条条数据
     * 游标非常适合处理数百万查询数据,这个样百万数据并不适合内存中获取
     * 如果在resultMap去收集结果,那么sql查询必须是有序的即设置(在id列进行设置resultOrdered="true")
     * Cursor contract to handle fetching items lazily using an Iterator.
     * Cursors are a perfect fit to handle millions of items queries that would not normally fits in memory.
     * If you use collections in resultMaps then cursor SQL queries must be ordered (resultOrdered="true")
     * using the id columns of the resultMap.
     *
     * @author Guillaume Darmont / guillaume@dropinocean.com
     */
    public interface Cursor<T> extends Closeable, Iterable<T> {
    
      /**游标开始从数据库获取数据这个就返回true
       * @return true if the cursor has started to fetch items from database.
       */
      boolean isOpen();
    
      /**
       * 判断所有元素是否已经获取完
       * @return true if the cursor is fully consumed and has returned all elements matching the query.
       */
      boolean isConsumed();
    
      /**
       * 获取数据的索引,从0开始,如果没有数据就返回-1
       * Get the current item index. The first item has the index 0.
       * @return -1 if the first cursor item has not been retrieved. The index of the current item retrieved.
       */
      int getCurrentIndex();
    }
    
    

    1.2总结

    1. 游标继承Closeable接口,这个接口只有一个close方法需要实现,一般用于资源需要手动关闭情况,各种io流之类这里是结果集(ResultSet需要关闭,所以继承这个接口)
    2. 继承Iterable接口,游标对结果集(ResultSet)进行遍历功能,需要实现一个迭代器的功能。

    2、DefaultCursor(默认游标实现类)

    2.1、源码

    /**
     *    Copyright 2009-2019 the original author or authors.
     *
     *    Licensed under the Apache License, Version 2.0 (the "License");
     *    you may not use this file except in compliance with the License.
     *    You may obtain a copy of the License at
     *
     *       http://www.apache.org/licenses/LICENSE-2.0
     *
     *    Unless required by applicable law or agreed to in writing, software
     *    distributed under the License is distributed on an "AS IS" BASIS,
     *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     *    See the License for the specific language governing permissions and
     *    limitations under the License.
     */
    package org.apache.ibatis.cursor.defaults;
    
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.Iterator;
    import java.util.NoSuchElementException;
    
    import org.apache.ibatis.cursor.Cursor;
    import org.apache.ibatis.executor.resultset.DefaultResultSetHandler;
    import org.apache.ibatis.executor.resultset.ResultSetWrapper;
    import org.apache.ibatis.mapping.ResultMap;
    import org.apache.ibatis.session.ResultContext;
    import org.apache.ibatis.session.ResultHandler;
    import org.apache.ibatis.session.RowBounds;
    
    /**
     * 这个默认实现,它线程不安全的
     * This is the default implementation of a MyBatis Cursor.
     * This implementation is not thread safe.
     *
     * @author Guillaume Darmont / guillaume@dropinocean.com
     */
    public class DefaultCursor<T> implements Cursor<T> {
    
      // ResultSetHandler stuff
      /**
       * 默认结果集处理类
       */
      private final DefaultResultSetHandler resultSetHandler;
    
      /**
       * 结果map映射关系
       */
      private final ResultMap resultMap;
    
      /**
       * 结果集包装类
       */
      private final ResultSetWrapper rsw;
    
      /**
       * 物理分页
       */
      private final RowBounds rowBounds;
    
      /**
       * 对象包装结果处理类
       */
      private final ObjectWrapperResultHandler<T> objectWrapperResultHandler = new ObjectWrapperResultHandler<>();
    
      /**
       * 游标迭代器
       */
      private final CursorIterator cursorIterator = new CursorIterator();
    
      /**
       * 不能多次打开游标,只能打开一次
       */
      private boolean iteratorRetrieved;
    
      /**
       * 游标的默认状态是创建
       */
      private CursorStatus status = CursorStatus.CREATED;
    
      /**
       * 分页对象的索引位置为-1
       */
      private int indexWithRowBound = -1;
    
      /**
       * 游标的状态
       */
      private enum CursorStatus {
    
        /**
         * 刚刚出炉的游标,数据库的结果集还没有被消费
         * A freshly created cursor, database ResultSet consuming has not started.
         */
        CREATED,
        /**游标已经被使用,同时结果集数据已经开始被使用了
         * A cursor currently in use, database ResultSet consuming has started.
         */
        OPEN,
        /**
         * 游标被关闭,可能并没有全部被消费掉
         * A closed cursor, not fully consumed.
         */
        CLOSED,
    
        /**
         * 表示游标已经遍历所有数据集,这个消费完游标一直将会被关闭掉
         * A fully consumed cursor, a consumed cursor is always closed.
         */
        CONSUMED
      }
    
      /**
       * 创建一个默认的游标
       * @param resultSetHandler 默认结果集处理类
       * @param resultMap 结果映射map
       * @param rsw 结果集包装类
       * @param rowBounds 分页对象
       */
      public DefaultCursor(DefaultResultSetHandler resultSetHandler, ResultMap resultMap, ResultSetWrapper rsw, RowBounds rowBounds) {
        this.resultSetHandler = resultSetHandler;
        this.resultMap = resultMap;
        this.rsw = rsw;
        this.rowBounds = rowBounds;
      }
    
      /**
       * 判断是否被打开
       * @return
       */
      @Override
      public boolean isOpen() {
        return status == CursorStatus.OPEN;
      }
    
      /**
       * 判断游标是否被消费掉
       * @return
       */
      @Override
      public boolean isConsumed() {
        return status == CursorStatus.CONSUMED;
      }
    
      /**
       * 获取当前的索引
       * 分页偏移量+游标迭代器索引位置
       * @return
       */
      @Override
      public int getCurrentIndex() {
        return rowBounds.getOffset() + cursorIterator.iteratorIndex;
      }
    
      /**
       * 进行获取迭代器
       * @return
       */
      @Override
      public Iterator<T> iterator() {
        //判断是否已经获取过一次迭代器了
        //判断迭代器是否关闭
        if (iteratorRetrieved) {
          throw new IllegalStateException("Cannot open more than one iterator on a Cursor");
        }
        if (isClosed()) {
          throw new IllegalStateException("A Cursor is already closed.");
        }
        iteratorRetrieved = true;
        return cursorIterator;
      }
    
      /**
       * 关闭游标
       */
      @Override
      public void close() {
        //如果游标已经关闭直接返回
        //获取结果集,如果结果集不为空,直接关闭,忽略关闭后异常
        //修改游标的状态为关闭
        if (isClosed()) {
          return;
        }
    
        ResultSet rs = rsw.getResultSet();
        try {
          if (rs != null) {
            rs.close();
          }
        } catch (SQLException e) {
          // ignore
        } finally {
          status = CursorStatus.CLOSED;
        }
      }
    
      protected T fetchNextUsingRowBound() {
        T result = fetchNextObjectFromDatabase();
        // 过滤到偏移量的位置
        while (result != null && indexWithRowBound < rowBounds.getOffset()) {
          result = fetchNextObjectFromDatabase();
        }
        return result;
      }
    
      /**
       * 从数据库中获取下一个对象
       * @return
       */
      protected T fetchNextObjectFromDatabase() {
        //判断游标是否已经关闭,已关闭返回null
        if (isClosed()) {
          return null;
        }
        // 设置当前状态是游标打开状态
        // 如果结果集包装类不是已经关闭
        // 把结果放入objectWrapperResultHandler对象的result中
        try {
          status = CursorStatus.OPEN;
          if (!rsw.getResultSet().isClosed()) {
            resultSetHandler.handleRowValues(rsw, resultMap, objectWrapperResultHandler, RowBounds.DEFAULT, null);
          }
        } catch (SQLException e) {
          throw new RuntimeException(e);
        }
        // 获取对象包装处理的结果
        // 如果结果不为空结果, 索引++
        T next = objectWrapperResultHandler.result;
        if (next != null) {
          indexWithRowBound++;
        }
        // No more object or limit reached
        //next为null或者读取条数等于偏移量+限制条数
        if (next == null || getReadItemsCount() == rowBounds.getOffset() + rowBounds.getLimit()) {
          close();
          status = CursorStatus.CONSUMED;
        }
        //把结果设置为null
        objectWrapperResultHandler.result = null;
    
        return next;
      }
    
      /**
       * 判断是否关闭
       * 游标本身处于关闭状态,或者已经取出结果的所有元素
       * @return
       */
      private boolean isClosed() {
        return status == CursorStatus.CLOSED || status == CursorStatus.CONSUMED;
      }
    
      /**
       * 下一个读取索引位置
       * @return
       */
      private int getReadItemsCount() {
        return indexWithRowBound + 1;
      }
    
      /**
       * 对象结果集包装类
       * @param <T>
       */
      private static class ObjectWrapperResultHandler<T> implements ResultHandler<T> {
    
        /**
         * 结果集
         */
        private T result;
    
        /**
         * 上下文中获取结果集
         * @param context
         */
        @Override
        public void handleResult(ResultContext<? extends T> context) {
          this.result = context.getResultObject();
          context.stop();
        }
      }
    
      /**
       * 创建一个游标迭代器对象
       */
      private class CursorIterator implements Iterator<T> {
    
        /**
         * 保存下一个将会被返回的对象
         * Holder for the next object to be returned.
         */
        T object;
    
        /**返回下一个对象的索引
         * Index of objects returned using next(), and as such, visible to users.
         */
        int iteratorIndex = -1;
    
        /**
         * 是否有下个
         * @return
         */
        @Override
        public boolean hasNext() {
          if (object == null) {
            object = fetchNextUsingRowBound();
          }
          return object != null;
        }
    
        /**
         * 判断下一个值
         * @return
         */
        @Override
        public T next() {
          // Fill next with object fetched from hasNext()
          //执行过haNext()方法object的值才不会为null
          T next = object;
          //表示没有执行hasNext()方法,所以在获取一次数据
          if (next == null) {
            next = fetchNextUsingRowBound();
          }
    
          if (next != null) {
            object = null;
            iteratorIndex++;
            return next;
          }
          throw new NoSuchElementException();
        }
    
        /**
         * 不支持删除对象
         */
        @Override
        public void remove() {
          throw new UnsupportedOperationException("Cannot remove element from Cursor");
        }
      }
    }
    
    

    2.2、总结

    1. 这个默认实现是线程不安全的
    2. ResultSetWrapper: 从数据库查询原始结果集
    3. ResultMap: xml或java注解配置结果的映射关系(数据库与java实体类之间的关系)
    4. DefaultResultSetHandler : 真正实现原始的结果集转成Java实体类的工具处理类
    5. ObjectWrapperResultHandler:DefaultResultSetHandler 处理后生成中间产物(上下文信息),也就是从这个对象中拿去转换成java实体类T
    6. RowBounds: 分页实体类(主要在遍历时候,确定游标起始位置和结束位置)
    7. CursorIterator : 默认实现游标的迭代器
    8. 游标不能多次获取迭代器(有且仅有一次)
    9. 这个核心方法fetchNextObjectFromDatabase(), 获取转换后实体类(这个实体类是一个泛型T表示)
    10. 游标有四个状态 创建、打开、关闭、已被消费
    展开全文
  • 介绍两种游标cursor与sys_refcursor

    千次阅读 2018-04-17 16:58:08
    1、cursor游标使用 /*简单cursor游标 *students表里面有name字段,你可以换做其他表测试 */ --定义 declare --定义游标并且赋值(is 不能和cursor分开使用) cursor stus_cur is select * from ...

    1、cursor游标使用

        /*简单cursor游标  
         *students表里面有name字段,你可以换做其他表测试  
         */  
        --定义   
        declare  
         --定义游标并且赋值(is 不能和cursor分开使用)   
         cursor stus_cur is select * from students;  
         --定义rowtype   
         cur_stu students%rowtype;  
         /*开始执行*/  
         begin  
           --开启游标   
           open stus_cur;  
              --loop循环   
              loop   
                --循环条件   
                exit when stus_cur%notfound;  
                --游标值赋值到rowtype   
                fetch stus_cur into cur_stu;  
                --输出   
                dbms_output.put_line(cur_stu.name);  
              --结束循环     
              end loop;  
            --关闭游标     
           close stus_cur;  
          /*结束执行*/  
         end;      

    执行结果

        SQL> declare  
          2   --定义游标并且赋值(is 不能和cursor分开使用)   
          3   cursor stus_cur is select * from students;  
          4   --定义rowtype   
          5   cur_stu students%rowtype;  
          6   /*开始执行*/  
          7   begin  
          8     --开启游标   
          9     open stus_cur;  
         10        --loop循环   
         11        loop  
         12          --循环条件   
         13          exit when stus_cur%notfound;  
         14          --游标值赋值到rowtype   
         15          fetch stus_cur into cur_stu;  
         16          --输出   
         17          dbms_output.put_line(cur_stu.name);  
         18        --结束循环   
         19        end loop;  
         20      --关闭游标   
         21     close stus_cur;  
         22    /*结束执行*/  
         23   end;  
         24  /  
    
        杨过  
        郭靖  
        付政委  
        刘自飞  
        江风  
        任我行  
        任盈盈  
        令狐冲  
        韦一笑  
        张无忌  
        朵儿  
        谢逊  
        小龙女  
        欧阳锋  
        欧阳锋  

    2、sys_refcursor游标使用

        /*  
         *游标名:sys_refcursor  
         *特别注意赋值方式:for  
         *与上重复内容不在叙述  
         */  
        declare  
           stu_cur sys_refcursor;  
           stuone students%rowtype;  
    
           begin  
             --这句赋值方式for   
             open stu_cur for select * from students;  
             --fetch赋值给rowtype   
             fetch stu_cur into stuone;  
    
             loop   
               dbms_output.put_line(stuone.name||' '||stuone.hobby);  
               fetch stu_cur into stuone;  
               exit when stu_cur%notfound;  
             end loop;  
           end;  

    执行结果

        SQL> /*  
          2   *游标名:sys_refcursor  
          3   *特别注意赋值方式:for  
          4   *与上重复内容不在叙述  
          5   */  
          6  declare  
          7     stu_cur sys_refcursor;  
          8     stuone students%rowtype;  
          9    
         10     begin  
         11       --这句赋值方式for   
         12       open stu_cur for select * from students;  
         13       --fetch赋值给rowtype   
         14       fetch stu_cur into stuone;  
         15    
         16       loop  
         17         dbms_output.put_line(stuone.name||' '||stuone.hobby);  
         18         fetch stu_cur into stuone;  
         19         exit when stu_cur%notfound;  
         20       end loop;  
         21     end;  
         22  /  
    
        杨过 保护小龙女  
        郭靖 修炼降龙十八掌  
        付政委 看小人书  
        刘自飞 编程写代码  
        江风 编程写代码  
        任我行 修炼神功  
        任盈盈 游山玩水  
        令狐冲 行侠仗义  
        韦一笑 吸拾人雪  
        张无忌 修行  
        朵儿 洗浴  
        谢逊 毕生研究屠龙刀  
        小龙女 修炼玉女心经  
        欧阳锋 看小人书  

    补充一种循环条件

        declare  
    
           stu_cur sys_refcursor;  
           stuone students%rowtype;  
    
           begin  
             open stu_cur for select * from students;  
             fetch stu_cur into stuone;  
             --特别注意循环条件的改变   
             --这个条件是发现了在循环   
             --与上一个notfound不同的   
             while stu_cur%found loop   
               dbms_output.put_line(stuone.name||' '||stuone.hobby);  
               fetch stu_cur into stuone;  
             end loop;  
           end;  

    oracle中REF Cursor用法

    1,什么是 REF游标 ?

    动态关联结果集的临时对象。即在运行的时候动态决定执行查询。

    2,REF 游标 有什么作用?

    实现在程序间传递结果集的功能,利用REF CURSOR也可以实现BULK SQL,从而提高SQL性能。

    3,静态游标和REF 游标的区别是什么?

    ①静态游标是静态定义,REF 游标是动态关联;
    ②使用REF 游标需REF 游标变量。
    ③REF 游标能做为参数进行传递,而静态游标是不可能的。

    4,什么是REF 游标变量?

    REF游标变量是一种 引用 REF游标类型 的变量,指向动态关联的结果集。

    5,怎么使用 REF游标 ?

    ①声明REF 游标类型,确定REF 游标类型;
    ⑴强类型REF游标:指定retrun type,REF 游标变量的类型必须和return type一致。
    语法:Type REF游标名 IS Ref Cursor Return 结果集返回记录类型;
    ⑵弱类型REF游标:不指定return type,能和任何类型的CURSOR变量匹配,用于获取任何结果集。
    语法:Type REF游标名 IS Ref Cursor;

    ②声明Ref 游标类型变量;
    语法:变量名 已声明Ref 游标类型;

    ③打开REF游标,关联结果集 ;
    语法:Open Ref 游标类型变量 For 查询语句返回结果集;

    ④获取记录,操作记录;
    语法:Fatch REF游标名 InTo 临时记录类型变量或属性类型变量列表;

    ⑤关闭游标,完全释放资源;
    语法:Close REF游标名;

    例子:强类型REF游标

    代码如下

     /*conn scott/tiger*/
     Declare 
      Type MyRefCurA IS  REF CURSOR RETURN emp%RowType;
      Type MyRefCurB IS  REF CURSOR RETURN emp.ename%Type;
      vRefCurA  MyRefCurA;
      vRefCurB  MyRefCurB;
      vTempA  vRefCurA%RowType;
      vTempB  vRefCurB.ename%Type;
    
     Begin
      Open  vRefCurA  For Select  *  from   emp   Where  SAL > 2000;
      Loop
       Fatch  vRefCurA InTo  vTempA;
       Exit  When  vRefCurA%NotFound;
       DBMS_OUTPUT.PUT_LINE(vRefCurA%RowCount||'  '|| vTempA.eno||'  '||vTempA.ename ||'  '||vTempA.sal)
      End Loop;
      Close vRefCurA;
    
      DBMS_OUTPUT.PUT_LINE('-------------------------------------------------------------------------------------------------------');
    
      Open  vRefCurB  For Select  ename  from   emp   Where  SAL > 2000;
      Loop
       Fatch  vRefCurB InTo  vTempB;
       Exit  When  vRefCurB%NotFound;
       DBMS_OUTPUT.PUT_LINE(vRefCurB%RowCount||'  '||vTempB)
      End Loop;
      Close vRefCurB; 
    
      DBMS_OUTPUT.PUT_LINE('-------------------------------------------------------------------------------------------------------');   
    
      Open  vRefCurA  For Select  *  from   emp   Where  JOB = 'CLERK';
      Loop
       Fatch  vRefCurA InTo  vTempA;
       Exit  When  vRefCurA%NotFound;
       DBMS_OUTPUT.PUT_LINE(vRefCurA%RowCount||'  '|| vTempA.eno||'  '||vTempA.ename ||'  '||vTempA.sal)
      End Loop;
      Close vRefCurA;
     End;

    例子:弱类型REF游标

    代码如下

    /*conn scott/tiger*/
     Declare
      Type MyRefCur  IS  Ref  Cursor;
      vRefCur MyRefCur;
      vtemp  vRefCur%RowType;
     Begin
      Case(&n)
       When  1 Then Open vRefCur  For Select   *   from emp;
       When  2 Then Open vRefCur  For Select   *   from dept;
       Else 
        Open vRefCur  For Select   eno,  ename  from emp Where JOB = 'CLERK';
      End Case;
      Close  vRefCur;
     End;

    6,怎样让REF游标作为参数传递?

    代码如下

    --作为函数返回值
    create or replace function returnacursor return sys_refcursor 
    is
       v_csr sys_refcursor;
    begin
        open v_csr for select a1 from test3;
        return v_csr;
    end;
    /
    
    declare
    c sys_refcursor;
    a1 char(2);
    begin
      c:=returnacursor;
      loop
        fetch c into a1;
        exit when c%notfound;
        dbms_output.put_line(a1);
      end loop;
      close c;
    end;
    /
    
    --作为参数
    create or replace procedure proc_ref_cursor (rc in sys_refcursor) as
      v_a number;
      v_b varchar2(10);
    
    begin
      loop
        fetch rc into v_a, v_b;
        exit when rc%notfound;
        dbms_output.put_line(v_a || ' ' || v_b);
      end loop;
    end;
    /
    
    declare
    v_rc sys_refcursor;
    begin
      open v_rc for 
      select a1,a2 from test3;
      proc_ref_cursor(v_rc);
      close v_rc;
    end;
    /

    REF CURSOR 示例包括下列三个 Visual Basic 示例,演示如何使用 REF CURSOR。

    示例 说明
    OracleDataReader 中检索 REF CURSOR 参数
    此示例执行一个 PL/SQL 存储过程,返回 REF CURSOR 参数,并将值作为 OracleDataReader 读取。

    使用 OracleDataReader 从多个 REF CURSOR 检索数据
    此示例执行一个 PL/SQL 存储过程,返回两个 REF CURSOR 参数,并使用 OracleDataReader 读取值。

    使用一个或多个 REF CURSOR 填充 DataSet
    此示例执行一个 PL/SQL 存储过程,返回两个 REF CURSOR 参数,并使用返回的行填充 DataSet

    要使用这些示例,可能需要创建 Oracle 表,并且必须创建 PL/SQL 包和包正文。

    创建 Oracle 表
    这些示例使用 Oracle Scott/Tiger 架构中定义的表。大多数 Oracle 安装均包括 Oracle Scott/Tiger 架构。如果此架构不存在,可以使用 {OracleHome}rdbmsadminscott.sql 中的 SQL 命令文件创建供这些示例使用的表和索引。

    创建 Oracle 包和包正文
    这些示例要求服务器上存在以下 PL/SQL 包和包正文。在 Oracle 服务器上创建以下 Oracle 包

    代码如下

    CREATE OR REPLACE PACKAGE BODY CURSPKG AS
        PROCEDURE OPEN_ONE_CURSOR (N_EMPNO IN NUMBER,
                                   IO_CURSOR IN OUT T_CURSOR)
        IS 
            V_CURSOR T_CURSOR; 
        BEGIN 
            IF N_EMPNO <> 0 
            THEN
                 OPEN V_CURSOR FOR 
                 SELECT EMP.EMPNO, EMP.ENAME, DEPT.DEPTNO, DEPT.DNAME 
                      FROM EMP, DEPT 
                      WHERE EMP.DEPTNO = DEPT.DEPTNO 
                      AND EMP.EMPNO = N_EMPNO;
    
            ELSE 
                 OPEN V_CURSOR FOR 
                 SELECT EMP.EMPNO, EMP.ENAME, DEPT.DEPTNO, DEPT.DNAME 
                      FROM EMP, DEPT 
                      WHERE EMP.DEPTNO = DEPT.DEPTNO;
    
            END IF;
            IO_CURSOR := V_CURSOR; 
        END OPEN_ONE_CURSOR;
    
        PROCEDURE OPEN_TWO_CURSORS (EMPCURSOR OUT T_CURSOR,
                                    DEPTCURSOR OUT T_CURSOR)
        IS 
            V_CURSOR1 T_CURSOR; 
            V_CURSOR2 T_CURSOR; 
        BEGIN 
            OPEN V_CURSOR1 FOR SELECT * FROM EMP;
            OPEN V_CURSOR2 FOR SELECT * FROM DEPT;
            EMPCURSOR  := V_CURSOR1; 
            DEPTCURSOR := V_CURSOR2; 
        END OPEN_TWO_CURSORS; 
    END CURSPKG;
    /

    Oracle提供REF CURSOR,通过该功能可以实现在程序间传递结果集的功能,利用REF CURSOR也可以实现BULK SQL,从而提高SQL性能。

    使用scott用户的emp表实现以下测试案例:

    代码如下

    SQL> desc emp
    Name Null? Type
    ----------------------------------------- -------- ----------------------------
    EMPNO NOT NULL NUMBER(4)
    ENAME VARCHAR2(10)
    JOB VARCHAR2(9)
    MGR NUMBER(4)
    HIREDATE DATE
    SAL NUMBER(7,2)
    COMM NUMBER(7,2)
    DEPTNO NUMBER(2)
    
    使用ref cursor获得结果集输出:
    
    
    SQL> set serveroutput on
    SQL> DECLARE
    2 TYPE mytable IS TABLE OF emp%ROWTYPE;
    3 l_data mytable;
    4 l_refc sys_refcursor;
    5 BEGIN
    6 OPEN l_refc FOR
    7 SELECT empno, ename, job, mgr, hiredate, sal, comm, deptno FROM emp;
    8 
    9 FETCH l_refc BULK COLLECT INTO l_data;
    10 
    11 CLOSE l_refc;
    12 
    13 FOR i IN 1 .. l_data.COUNT
    14 LOOP
    15 DBMS_OUTPUT.put_line ( l_data (i).ename
    16 || ' was hired since '
    17 || l_data (i).hiredate
    18 );
    19 END LOOP;
    20 END;
    21 /
    SMITH was hired since 17-DEC-80
    ALLEN was hired since 20-FEB-81
    WARD was hired since 22-FEB-81
    JONES was hired since 02-APR-81
    MARTIN was hired since 28-SEP-81
    BLAKE was hired since 01-MAY-81
    CLARK was hired since 09-JUN-81
    SCOTT was hired since 19-APR-87
    KING was hired since 17-NOV-81
    TURNER was hired since 08-SEP-81
    ADAMS was hired since 23-MAY-87
    JAMES was hired since 03-DEC-81
    FORD was hired since 03-DEC-81
    MILLER was hired since 23-JAN-82
    
    PL/SQL procedure successfully completed.
    
    
    -The End-
    展开全文
  • Postgresql - cursor介绍

    千次阅读 2018-09-04 22:36:10
    以下内容大部分翻译自官方文档。 ... ==============================================...可以设置一个cursor来封装查询,然后一次读取几行查询结果,而不是同时执行整个查询。这样做的一个原因是,当结果包含大量行时...
  • cursor 与refcursor及sys_refcursor的区别 (转载) 2015年11月27日 15:16:19 cherish1forever 阅读数:2143 引用 一、显式cursor  显式是相对与隐式cursor而言的,就是有一个明确的声明的cursor。显式游标的...
  • 在页面布局时,CSS是工作中必...CSS中的属性非常多,今天就着重讲一个属性,即CSS cursor属性,以及它的很多可选值,比如:cursor 手型 就是用的 cursor:pointer 这个属性。cursor怎么用?一、CSS cursor 基本语法c...
  • pymongo 模块的 Cursor 对象在 2021年11月30日‎ 之后因为更新到 4.0 版本,删除了 Cursor 类里的 count 方法,以下是 4.0 和 3.12.2 两个版本的 Cursor 类对比: ...
  • mongodb基础篇--cursor对象

    千次阅读 2019-12-02 20:10:03
    Cursor 对象不是查询结果,而是查询返回的 接口。当我们调用 find()/findMany()/findOne() 时,Shell 并不是立即从数据库中取出数据,而是在我们使用时才会取出数据。Cursor 对象有很多方法,例如 close(),hasNext...
  • Cursor的关闭问题

    千次阅读 2020-05-27 14:12:57
    最近在工作中处理了一些内存泄露的问题,在这个过程中我尤其发现了一些基本的问题反而忽略导致内存泄露,比如静态变量,cursor关闭,流关闭,线程,定时器,反注册,bitmap等等,我稍微统计并总结了一下,当然了,...
  • Note that RELEASE_CURSOR=YES overrides HOLD_CURSOR=YES and that HOLD_CURSOR=NO overrides RELEASE_CURSOR=NO. For information showing how these two options interact, refer to Table C-1. MAXOPENCURSORS=...
  • cursor属性

    千次阅读 2019-09-30 04:32:06
    cursor属性定义鼠标指针放在一个元素边界范围内时所用的光标的形状 属性值 在cursor中我们最常用到的属性是default和pointer default是cursor属性的默认值,展现的是一个光标效果。 pointer光标呈现为指示...
  • android中Cursor类方法

    2021-09-28 15:23:59
    使用过 SQLite数据库的童鞋对 Cursor 应该不陌生,加深自己和大家对Android 中使用 Cursor 的理解。 关于 Cursor 在你理解和使用 Android Cursor 的时候你必须先知道关于 Cursor 的几件事情: Cursor 是每行的...
  • 引用 一、显式cursor  显式是相对与隐式cursor而言的,就是有一个...cursor cursor_name (parameter list) is select ...  游标从declare、open、fetch、close是一个完整的生命旅程。当然了一个这样的游标是
  • CSS 鼠标样式 cursor属性

    万次阅读 2018-02-19 22:13:28
    鼠标样式在浏览网页时,通常看到的鼠标光标形状有箭头、手形、...为了创建丰富的Web应用,CSS中提供了 cursor属性,允许设计师为页面上的任何元素自定义鼠标光标的形状。如,把鼠标光标样式设置为 row-resize,表...
  • Oracle中Cursor介绍和使用

    万次阅读 2017-11-22 15:16:18
    一 概念  游标是SQL的一个内存工作区,由系统或用户以变量的形式定义。游标的作用就是用于临时存储从数据库中提取的数据块。在某些情况下,需要把数据从... Cursor类型包含三种: 隐式Cursor,显式Cursor和Ref Cur
  • ## AttributeError: 'function' object has no attribute 'cursor' 初次试用python连接sqlserver数据库,按照别人的教程来,不知道为啥出现这样的错误,请大神帮忙解决一下,谢谢! ``` import pymssql #引入...
  • 安卓 sqlite中cursor的问题 ---------------------------------------------------- public int sel(String carNum){ db = dbHelper.getWritableDatabase(); Cursor cursor = db.query("recharge",null,...
  • css cursor用法

    千次阅读 2019-05-23 19:41:59
    css cursor用法 css 属性 cursor 的用法,是改变元素内光标样式;想必各位都很熟悉,关于它的值,你能知道几个呢? 下面将 cursor 用法总结如下: cursor: pointer; /* 手*/ cursor: crosshair; /* 十字准心 */ ...
  • 4.pymysql .cursor属性方法(tcy)

    万次阅读 2019-01-27 12:59:02
    Cursor 普通的游标对象,默认创建的游标对象 SSCursor 不缓存游标,主要用于当操作需要返回大量数据的时候 DictCursor 以字典的形式返回操作结果 SSDictCursor 不缓存游标,将...
  • 3) 隐式Cursor是系统自动打开和关闭Cursor. 下面是一个例子: BEGIN UPDATE emp SET comm = comm * 1.12 WHERE empno = 7389; --更新员工编号为7389的员工信息 --使用隐式游标属性判断已更新的行数 DBMS_...
  • 介绍PostgreSQL游标(Cursor)

    万次阅读 2019-05-28 18:59:34
    介绍PostgreSQL游标(Cursor) 本文我们通过一些示例进行详细说明如何使用PostgreSQL游标。 概述 PostgreSQL游标可以封装查询并对其中每一行记录进行单独处理。当我们想对大量结果集进行分批处理时可以使用游标,...
  • 当pymongo.cursor.Cursor没有抓到数据时,就无法判断next(),即会报错 MongolDB查询模拟 import pymongo x = db.col.find() # 直接打印输出内容,发现继承的是object,而不是dict或者list print(x) # 识别试下他的...
  • cursor的所有样式

    千次阅读 2018-09-15 11:21:19
    cursor可以为按钮或者某些区域强制定义一种鼠标移上去的鼠标光标形状。 定义和用法 cursor 属性规定要显示的光标的类型(形状)。  该属性定义了鼠标指针放在一个元素边界范围内时所用的光标形状(不过 CSS2.1 ...
  • 在执行cursor = conn.cursor()报错 ![图片说明](https://img-ask.csdn.net/upload/201704/26/1493196649_619205.png) Traceback (most recent call last): File "mid_tables.py", line 17, in cursor= conn....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 515,164
精华内容 206,065
关键字:

cursor

友情链接: ODbgScript_Win2k.rar