cursor_cursorloader - CSDN
精华内容
参与话题
  • cursor的用法

    千次阅读 2019-08-12 10:56:55
    1、CSS cursor属加粗样式性 cursor属性规定要显示的光标的类型(形状) 该属性定义了鼠标指针放在一个元素边界范围内时所用的光标形状 javascript语法 object.style.cursor = "crosshair" 可能的值: default:默认...

    1、CSS cursor属加粗样式

    cursor属性规定要显示的光标的类型(形状)
    该属性定义了鼠标指针放在一个元素边界范围内时所用的光标形状

    javascript语法

    object.style.cursor = "crosshair"
    

    可能的值:
    default:默认光标(通常是一个箭头)
    auto:默认,浏览器设置的光标
    crosshair:光标呈现为十字线
    pointer:光标呈现为一只手
    move:光标呈现某对象可移动
    text:光标指示文本
    wait:光标指示程序正在忙(通常是一只表或者一个沙漏)

    <span style="cursor:text">
    </span>
    

    2、mysql cursor

    cursor是一个记录标识,用于一行一行迭代的访问查询返回的结果
    (用来标识数据去到什么地方了,把他理解为数组中的下标)

    cursoe 的特性

    1、只读的,不能更新
    2、不能滚动
    3、不敏感的,不敏感意为服务器可以或不可以复制它的结果
    游标(cursor)必须在声明处理程序前被声明,并且变量和条件必须在声明游标或处理程序前被声明

    3、python sql cursor用法

    python操作数据库,可以使用pymysql包

    1、导入pymysql

    import pymysql
    

    2、建立连接

    def connectDB():
    	coon = pymysql.connect(
    		host = '127.0.0.1',   #数据库主机地址
    		port = '3306',   #端口
    		user = 'zizi',   #数据库用户名
    		passwd = 'zizi',   #数据库密码
    		db = 'case',
    		charset = 'utf8',
    		cursorclass = pymysql.cursors.DictCursor)
    		#可以指定返回的类型,指定为queryset 的字典类型,比较方便
    	return coon
    

    3、执行数据库操作

    conn = connectDB()
    	with conn.cursor() as cursor:
    		sql = "select * from limit 10"  #在test表中取出10条数据
    			search_count = cursor.execute(sql)
    			result = cursor.fetchall()
    

    cursor用来执行命令的方法:

    callproc(self,procname,args):用来执行存储过程,接收的参数为存储过程名和参数名,返回值为受影响的行数

    excute(self,query,args)
    #执行单条sql语句,接收的参数为sql语句本身和使用的参数列表
    #返回值为受影响的行数
    
    展开全文
  • Oracle中Cursor介绍和使用

    万次阅读 2017-11-22 15:16:18
    一 概念  游标是SQL的一个内存工作区,由系统或用户以变量的形式定义。游标的作用就是用于临时存储从数据库中提取的数据块。在某些情况下,需要把数据从... Cursor类型包含三种: 隐式Cursor,显式Cursor和Ref Cur

    一  概念 
    游标是SQL的一个内存工作区,由系统或用户以变量的形式定义。游标的作用就是用于临时存储从数据库中提取的数据块。在某些情况下,需要把数据从存放在磁盘的表中调到计算机内存中进行处理,最后将处理结果显示出来或最终写回数据库。这样数据处理的速度才会提高,否则频繁的磁盘数据交换会降低效率。 
    二  类型 
      Cursor类型包含三种: 隐式Cursor,显式Cursor和Ref Cursor(动态Cursor)。 
    1. 隐式Cursor: 
    1).对于Select …INTO…语句,一次只能从数据库中获取到一条数据,对于这种类型的DML Sql语句,就是隐式Cursor。例如:Select /Update / Insert/Delete操作。 
    2)作用:可以通过隐式Cusor的属性来了解操作的状态和结果,从而达到流程的控制。Cursor的属性包含: 
    SQL%ROWCOUNT 整型 代表DML语句成功执行的数据行数 
    SQL%FOUND  布尔型  值为TRUE代表插入、删除、更新或单行查询操作成功 
    SQL%NOTFOUND 布尔型 与SQL%FOUND属性返回值相反 
    SQL%ISOPEN 布尔型 DML执行过程中为真,结束后为假 
    3) 隐式Cursor是系统自动打开和关闭Cursor. 
    下面是一个Sample: 

    [c-sharp] view plain copy
    1. Set Serveroutput on;  
    2.   
    3. begin  
    4.     update t_contract_master set liability_state = 1 where policy_code = '123456789';  
    5.       
    6.     if SQL%Found then  
    7.        dbms_output.put_line('the Policy is updated successfully.');  
    8.        commit;  
    9.     else  
    10.       dbms_output.put_line('the policy is updated failed.');  
    11.     end if;  
    12.   
    13. end;  
    14.   
    15. /  
     

    2. 显式Cursor: 
    (1) 对于从数据库中提取多行数据,就需要使用显式Cursor。显式Cursor的属性包含: 
    游标的属性   返回值类型   意    义  
    %ROWCOUNT   整型  获得FETCH语句返回的数据行数  
    %FOUND  布尔型 最近的FETCH语句返回一行数据则为真,否则为假  
    %NOTFOUND   布尔型 与%FOUND属性返回值相反  
    %ISOPEN 布尔型 游标已经打开时值为真,否则为假  

    (2) 对于显式游标的运用分为四个步骤: 
     定义游标---Cursor  [Cursor Name]  IS; 
     打开游标---Open  [Cursor Name]; 
     操作数据---Fetch  [Cursor name] 
     关闭游标---Close [Cursor Name],这个Step绝对不可以遗漏。 
    (3)以下是三种常见显式Cursor用法。

    [c-sharp] view plain copy
    1. Set serveroutput on;  
    2.   
    3. declare   
    4.     ---define Cursor  
    5.     Cursor cur_policy is  
    6.      select cm.policy_code, cm.applicant_id, cm.period_prem,cm.bank_code,cm.bank_account  
    7.      from t_contract_master cm  
    8.      where cm.liability_state = 2  
    9.      and cm.policy_type = 1  
    10.      and cm.policy_cate in ('2','3','4')  
    11.      and rownum < 5  
    12.      order by cm.policy_code desc;  
    13.     curPolicyInfo cur_policy%rowtype;---定义游标变量  
    14. Begin  
    15.    open cur_policy; ---open cursor  
    16.    Loop   
    17.      --deal with extraction data from DB  
    18.      Fetch cur_policy into curPolicyInfo;  
    19.      Exit when cur_policy%notfound;  
    20.            
    21.      Dbms_Output.put_line(curPolicyInfo.policy_code);  
    22.    end loop;  
    23.    Exception   
    24.      when others then  
    25.          close cur_policy;  
    26.          Dbms_Output.put_line(Sqlerrm);  
    27.            
    28.    if cur_policy%isopen then    
    29.     --close cursor   
    30.       close cur_policy;  
    31.    end if;  
    32. end;  
    33.   
    34. /  
    35. ------------------------  
    36.   
    37. Set serveroutput on;  
    38.   
    39. declare   
    40.     Cursor cur_policy is  
    41.      select cm.policy_code, cm.applicant_id, cm.period_prem,cm.bank_code,cm.bank_account  
    42.      from t_contract_master cm  
    43.      where cm.liability_state = 2  
    44.      and cm.policy_type = 1  
    45.      and cm.policy_cate in ('2','3','4')  
    46.      and rownum < 5  
    47.      order by cm.policy_code desc;  
    48.      v_policyCode t_contract_master.policy_code%type;  
    49.      v_applicantId t_contract_master.applicant_id%type;  
    50.      v_periodPrem t_contract_master.period_prem%type;  
    51.      v_bankCode t_contract_master.bank_code%type;  
    52.      v_bankAccount t_contract_master.bank_account%type;  
    53. Begin  
    54.    open cur_policy;  
    55.    Loop   
    56.      Fetch cur_policy into v_policyCode,  
    57.                            v_applicantId,  
    58.                            v_periodPrem,  
    59.                            v_bankCode,  
    60.                            v_bankAccount;  
    61.      Exit when cur_policy%notfound;  
    62.            
    63.      Dbms_Output.put_line(v_policyCode);  
    64.    end loop;  
    65.    Exception   
    66.      when others then  
    67.          close cur_policy;  
    68.          Dbms_Output.put_line(Sqlerrm);  
    69.            
    70.    if cur_policy%isopen then     
    71.       close cur_policy;  
    72.    end if;  
    73. end;  
    74. /  
    75. --------------------------------  
    76. Set serveroutput on;  
    77.   
    78. declare   
    79.     Cursor cur_policy is  
    80.      select cm.policy_code, cm.applicant_id, cm.period_prem,cm.bank_code,cm.bank_account  
    81.      from t_contract_master cm  
    82.      where cm.liability_state = 2  
    83.      and cm.policy_type = 1  
    84.      and cm.policy_cate in ('2','3','4')  
    85.      and rownum < 5  
    86.      order by cm.policy_code desc;  
    87. Begin  
    88.    For rec_Policy in cur_policy loop  
    89.        Dbms_Output.put_line(rec_policy.policy_code);  
    90.    end loop;  
    91.    Exception   
    92.      when others then  
    93.          Dbms_Output.put_line(Sqlerrm);  
    94.            
    95. end;  
    96.   
    97. /  

     

    3. Ref Cursor(动态游标): 
    1) 与隐式Cursor,显式Cursor的区别:Ref Cursor是可以通过在运行期间传递参数来获取数据结果集。而另外两种Cursor,是静态的,在编译期间就决定数据结果集。 
    2) Ref cursor的使用: 
     Type [Cursor type name] is ref cursor 
     Define 动态的Sql语句 
     Open cursor 
     操作数据---Fetch  [Cursor name] 
     Close Cursor 
    下面是一个Sample:

    [c-sharp] view plain copy
    1. Set serveroutput on;  
    2.   
    3. Declare  
    4.     ---define cursor type name  
    5.     type cur_type is ref cursor;  
    6.     cur_policy cur_type;  
    7.     sqlStr varchar2(500);  
    8.     rec_policy t_contract_master%rowtype;  
    9. begin  
    10.    ---define 动态Sql  
    11.    sqlStr := 'select cm.policy_code, cm.applicant_id, cm.period_prem,cm.bank_code,cm.bank_account from t_contract_master cm  
    12.      where cm.liability_state = 2   
    13.      and cm.policy_type = 1   
    14.      and cm.policy_cate in (2,3,4)   
    15.      and rownum < 5   
    16.      order by cm.policy_code desc ';  
    17. ---Open Cursor  
    18.   open cur_policy for sqlStr;  
    19.   loop  
    20.        fetch cur_policy into rec_policy.policy_code, rec_policy.applicant_id, rec_policy.period_prem,rec_policy.bank_code,rec_policy.bank_account;  
    21.        exit when cur_policy%notfound;  
    22.          
    23.        Dbms_Output.put_line('Policy_code:'||rec_policy.policy_code);  
    24.     
    25.   end loop;  
    26. close cur_policy;      
    27.   
    28. end;  
    29. /  

    4.常见Exception 

    [c-sharp] view plain copy
    1. 1.  错 误 名 称 错误代码    错 误 含 义     
    2. 2.  CURSOR_ALREADY_OPEN ORA_06511   试图打开已经打开的游标     
    3. 3.  INVALID_CURSOR  ORA_01001   试图使用没有打开的游标     
    4. 4.  DUP_VAL_ON_INDEX    ORA_00001   保存重复值到惟一索引约束的列中     
    5. 5.  ZERO_DIVIDE ORA_01476   发生除数为零的除法错误     
    6. 6.  INVALID_NUMBER  ORA_01722   试图对无效字符进行数值转换     
    7. 7.  ROWTYPE_MISMATCH    ORA_06504   主变量和游标的类型不兼容     
    8. 8.  VALUE_ERROR ORA_06502   转换、截断或算术运算发生错误     
    9. 9.  TOO_MANY_ROWS   ORA_01422   SELECT…INTO…语句返回多于一行的数据     
    10. 10. NO_DATA_FOUND   ORA_01403   SELECT…INTO…语句没有数据返回     
    11. 11. TIMEOUT_ON_RESOURCE ORA_00051   等待资源时发生超时错误     
    12. 12. TRANSACTION_BACKED_OUT  ORA_00060   由于死锁,提交失败     
    13. 13. STORAGE_ERROR   ORA_06500   发生内存错误     
    14. 14. PROGRAM_ERROR   ORA_06501   发生PL/SQL内部错误     
    15. 15. NOT_LOGGED_ON   ORA_01012   试图操作未连接的数据库     
    16. 16. LOGIN_DENIED    ORA_01017   在连接时提供了无效用户名或口令    

     

    附:使用游标

    [c-sharp] view plain copy
    1. 15-1:使用标量变量接收游标数据  
    2.     DECLARE  
    3.       CURSOR emp_cursor IS  
    4.         SELECT ename,job,sal FROM emp WHERE deptno=&dno;  
    5.       v_ename emp.ename%TYPE;  
    6.       v_sal emp.sal%TYPE;  
    7.       v_job emp.job%TYPE;  
    8.     BEGIN  
    9.       OPEN emp_cursor;  
    10.       LOOP  
    11.         FETCH emp_cursor INTO v_ename,v_job,v_sal;  
    12.         EXIT WHEN emp_cursor%NOTFOUND;  
    13.         dbms_output.put_line('姓名:'||v_ename||',岗位:'||v_job||',工资:'||v_sal);  
    14.       END LOOP;  
    15.       CLOSE emp_cursor;  
    16.     END;  
    17.     /  
    18. 15-2:使用pl/sql纪录变量接收游标数据  
    19.     DECLARE  
    20.       CURSOR emp_cursor IS  
    21.         SELECT ename,sal FROM emp ORDER BY sal DESC;  
    22.       emp_record emp_cursor%ROWTYPE;  
    23.     BEGIN  
    24.       OPEN emp_cursor;  
    25.       LOOP  
    26.         FETCH emp_cursor INTO emp_record;  
    27.         EXIT WHEN emp_cursor%NOTFOUND OR emp_cursor%ROWCOUNT>&n;  
    28.         dbms_output.put_line('姓名:'||emp_record.ename||  
    29.          ',工资:'||emp_record.sal);  
    30.       END LOOP;  
    31.       CLOSE emp_cursor;  
    32.     END;  
    33.     /  
    34. 15-3:使用pl/sql集合变量接收游标数据  
    35.     DECLARE  
    36.       CURSOR emp_cursor IS SELECT ename,sal FROM emp  
    37.         WHERE lower(job)=lower('&job');  
    38.       TYPE emp_table_type IS TABLE OF emp_cursor%ROWTYPE  
    39.         INDEX BY BINARY_INTEGER;  
    40.       emp_table emp_table_type;  
    41.       i INT;  
    42.     BEGIN  
    43.       OPEN emp_cursor;  
    44.       LOOP  
    45.         i:=emp_cursor%ROWCOUNT+1;  
    46.         FETCH emp_cursor INTO emp_table(i);  
    47.         EXIT WHEN emp_cursor%NOTFOUND;  
    48.         dbms_output.put_line('姓名:'||emp_table(i).ename||  
    49.           ',工资:'||emp_table(i).sal);  
    50.       END LOOP;  
    51.       CLOSE emp_cursor;  
    52.     END;  
    53.     /  
    54. 15-4:在游标for循环中引用已定义游标  
    55.     DECLARE  
    56.       CURSOR emp_cursor IS SELECT ename,hiredate FROM emp  
    57.         ORDER BY hiredate DESC;  
    58.     BEGIN  
    59.       FOR emp_record IN emp_cursor LOOP  
    60.         dbms_output.put_line('姓名:'||emp_record.ename  
    61.           ||',工作日期:'||emp_record.hiredate);  
    62.         EXIT WHEN emp_cursor%ROWCOUNT=&n;  
    63.       END LOOP;  
    64.     END;  
    65.     /  
    66. 15-5:在游标for循环中直接引用子查询  
    67.     BEGIN  
    68.       FOR emp_record IN (SELECT ename,hiredate,rownum FROM emp  
    69.         ORDER BY hiredate) LOOP  
    70.         dbms_output.put_line('姓名:'||emp_record.ename  
    71.          ||',工作日期:'||emp_record.hiredate);  
    72.         EXIT WHEN emp_record.rownum=&n;  
    73.       END LOOP;  
    74.     END;  
    75.     /  
    76. 15-6:参数游标  
    77.     DECLARE  
    78.       CURSOR emp_cursor(dno NUMBER) IS  
    79.         SELECT ename,job FROM emp WHERE deptno=dno;  
    80.     BEGIN  
    81.       FOR emp_record IN emp_cursor(&dno) LOOP  
    82.         dbms_output.put_line('姓名:'||emp_record.ename  
    83.           ||',岗位:'||emp_record.job);  
    84.       END LOOP;  
    85.     END;  
    86.     /  
    87. 15-7:更新游标行  
    88.     DECLARE  
    89.       CURSOR emp_cursor IS  
    90.         SELECT ename,sal,deptno FROM emp FOR UPDATE;  
    91.       dno INT:=&no;  
    92.     BEGIN  
    93.       FOR emp_record IN emp_cursor LOOP  
    94.         IF emp_record.deptno=dno THEN  
    95.            dbms_output.put_line('姓名:'||emp_record.ename  
    96.             ||',原工资:'||emp_record.sal);  
    97.            UPDATE emp SET sal=sal*1.1 WHERE CURRENT OF emp_cursor;  
    98.         END IF;  
    99.       END LOOP;  
    100.     END;  
    101.     /  
    102. 15-8:删除游标行  
    103.     DECLARE  
    104.       CURSOR emp_cursor IS  
    105.         SELECT ename FROM emp FOR UPDATE;  
    106.       name VARCHAR2(10):=lower('&name');  
    107.     BEGIN  
    108.       FOR emp_record IN emp_cursor LOOP  
    109.         IF lower(emp_record.ename)=name THEN  
    110.            DELETE FROM emp WHERE CURRENT OF emp_cursor;  
    111.         ELSE  
    112.            dbms_output.put_line('姓名:'||emp_record.ename);  
    113.         END IF;  
    114.       END LOOP;  
    115.     END;  
    116.     /  
    117. 15-9:使用of子句在特定表上加行共享锁.  
    118.     DECLARE  
    119.       CURSOR emp_cursor IS  
    120.         SELECT a.dname,b.ename FROM dept a JOIN emp b  
    121.         ON a.deptno=b.deptno  
    122.         FOR UPDATE OF b.deptno;  
    123.       name VARCHAR2(10):=LOWER('&name');  
    124.     BEGIN  
    125.       FOR emp_record IN emp_cursor LOOP  
    126.         IF LOWER(emp_record.dname)=name THEN  
    127.           dbms_output.put_line('姓名:'||emp_record.ename);  
    128.           DELETE FROM emp WHERE CURRENT OF emp_cursor;  
    129.         END IF;  
    130.       END LOOP;  
    131.     END;  
    132.     /  
    133. 15-10:使用无返回类型的游标变量  
    134.     DECLARE  
    135.       TYPE ref_cursor_type IS REF CURSOR;  
    136.       ref_cursor ref_cursor_type;  
    137.       v1 NUMBER(6);  
    138.       v2 VARCHAR2(10);  
    139.     BEGIN  
    140.       OPEN ref_cursor FOR  
    141.         SELECT &col1 col1,&col2 col2 FROM &table WHERE &cond;  
    142.       LOOP  
    143.         FETCH ref_cursor INTO v1,v2;  
    144.         EXIT WHEN ref_cursor%NOTFOUND;  
    145.         dbms_output.put_line('col1='||v1||',col2='||v2);  
    146.       END LOOP;  
    147.       CLOSE ref_cursor;  
    148.     END;  
    149.     /  
    150. 15-11:使用有返回类型的游标变量  
    151.     DECLARE  
    152.       TYPE emp_cursor_type IS REF CURSOR RETURN emp%ROWTYPE;  
    153.       emp_cursor emp_cursor_type;  
    154.       emp_record emp%ROWTYPE;  
    155.     BEGIN  
    156.       OPEN emp_cursor FOR SELECT * FROM emp  
    157.         WHERE deptno=&dno;  
    158.       LOOP  
    159.         FETCH emp_cursor INTO emp_record;  
    160.         EXIT WHEN emp_cursor%NOTFOUND;  
    161.         dbms_output.put_line('姓名:'||emp_record.ename||  
    162.           ',工资:'||emp_record.sal);  
    163.       END LOOP;  
    164.       CLOSE emp_cursor;  
    165.     END;  
    166.     /  
    167. 15-12:使用fetch...bulk collect提取所有数据  
    168.     DECLARE  
    169.       CURSOR emp_cursor IS  
    170.         SELECT * FROM emp WHERE LOWER(job)=LOWER('&job');  
    171.       TYPE emp_table_type IS TABLE OF emp%ROWTYPE;  
    172.       emp_table emp_table_type;  
    173.     BEGIN  
    174.       OPEN emp_cursor;  
    175.       FETCH emp_cursor BULK COLLECT INTO emp_table;  
    176.       CLOSE emp_cursor;  
    177.       FOR i IN 1.. emp_table.COUNT LOOP  
    178.         dbms_output.put_line('姓名:'||emp_table(i).ename  
    179.           ||',工资:'||emp_table(i).sal);  
    180.       END LOOP;  
    181.     END;  
    182.     /  
    183. 15-13:使用limit子句限制提取行数  
    184.     DECLARE  
    185.       CURSOR emp_cursor IS SELECT * FROM emp;  
    186.       TYPE emp_array_type IS VARRAY(5) OF emp%ROWTYPE;  
    187.       emp_array emp_array_type;  
    188.     BEGIN  
    189.       OPEN emp_cursor;  
    190.       LOOP  
    191.         FETCH emp_cursor BULK COLLECT INTO emp_array LIMIT &rows;  
    192.         FOR i IN 1..emp_array.COUNT LOOP  
    193.           dbms_output.put_line('姓名:'||emp_array(i).ename  
    194.             ||',工资:'||emp_array(i).sal);  
    195.         END LOOP;  
    196.         EXIT WHEN emp_cursor%NOTFOUND;  
    197.       END LOOP;  
    198.       CLOSE emp_cursor;  
    199.     END;  
    200.     /  
    201. 15-14:使用cursor表达式  
    202.     DECLARE  
    203.       CURSOR dept_cursor(no NUMBER) IS  
    204.          SELECT a.dname,CURSOR(SELECT * FROM emp  
    205.          WHERE deptno=a.deptno)  
    206.          FROM dept a WHERE a.deptno=no;  
    207.       TYPE ref_cursor_type IS REF CURSOR;  
    208.       emp_cursor ref_cursor_type;  
    209.       emp_record emp%ROWTYPE;  
    210.       v_dname dept.dname%TYPE;  
    211.     BEGIN  
    212.       OPEN dept_cursor(&dno);  
    213.       LOOP  
    214.          FETCH dept_cursor INTO v_dname,emp_cursor;  
    215.          EXIT WHEN dept_cursor%NOTFOUND;  
    216.          dbms_output.put_line('部门名:'||v_dname);  
    217.          LOOP  
    218.            FETCH emp_cursor INTO emp_record;  
    219.            EXIT WHEN emp_cursor%NOTFOUND;  
    220.            dbms_output.put_line('----雇员名:'||emp_record.ename  
    221.             ||',岗位:'||emp_record.job);  
    222.          END LOOP;  
    223.       END LOOP;  
    224.       CLOSE dept_cursor;  
    225.     END;  
    226.     /  

    展开全文
  • cursor使用例子

    2019-06-16 21:20:22
    1. 关于 Cursor 在你理解和使用 Android Cursor 的时候你必须先知道关于 Cursor 的几件事情: Cursor 是每行的集合。 使用 moveToFirst() 定位第一行。 你必须知道每一列的名称。 你必须知道每一列的数据类型。 ...


    1. 关于 Cursor


    在你理解和使用 Android Cursor 的时候你必须先知道关于 Cursor 的几件事情:
    Cursor 是每行的集合。
    使用 moveToFirst() 定位第一行。
    你必须知道每一列的名称。
    你必须知道每一列的数据类型。
    Cursor 是一个随机的数据源。
    所有的数据都是通过下标取得。
    Cursor 位于 android.database.Cursor类,可见出它的设计是基于数据库服务产生的。
    在Android 查询数据是通过Cursor 类来实现的。当我们使用 SQLiteDatabase.query()方法时,就会得到Cursor对象, Cursor所指向的就是每一条数据。

     


    2. 关于 Cursor 的重要方法:
    close()
    关闭游标,释放资源


    copyStringToBuffer(int columnIndex, CharArrayBuffer buffer)
    在缓冲区中检索请求的列的文本,将将其存储


    getColumnCount()
    返回所有列的总数


    getColumnIndex(String columnName)
    返回指定列的名称,如果不存在返回-1


    getColumnIndexOrThrow(String columnName)
    从零开始返回指定列名称,如果不存在将抛出IllegalArgumentException 异常。


    getColumnName(int columnIndex)
    从给定的索引返回列名


    getColumnNames()
    返回一个字符串数组的列名


    getCount()
    返回Cursor 中的行数


    moveToFirst()
    移动光标到第一行


    moveToLast()
    移动光标到最后一行


    moveToNext()
    移动光标到下一行


    moveToPosition(int position)
    移动光标到一个绝对的位置


    moveToPrevious()
    移动光标到上一行


    3. 小例子:
    (1) 为空的Cursor的判断
    if (cur.moveToFirst() == false)
    {
    //为空的Cursor
    return;
    }


    (2) 访问 Cursor 的下标获得其中的数据


    int nameColumnIndex = cur.getColumnIndex(People.NAME);
    String name = cur.getString(nameColumnIndex);


    (3)循环 Cursor 取出需要的数据


    while(cur.moveToNext())
    {
    //光标移动成功
    //把数据取出
    }


    当cur.moveToNext() 为假时将跳出循环,即Cursor数据循环完毕。


    如果你喜欢用 for 循环而不想用While 循环可以使用Google 提供的几下方法:
    isBeforeFirst()
    返回游标是否指向之前第一行的位置


    isAfterLast()
    返回游标是否指向第最后一行的位置


    isClosed()
    如果返回 true 即表示该游戏标己关闭


    有了以上的方法,可以如此取出数据:


    AbstractCursor
    for(cur.moveToFirst();!cur.isAfterLast();cur.moveToNext())
    {
        int nameColumn = cur.getColumnIndex(People.NAME);
        int phoneColumn = cur.getColumnIndex(People.NUMBER);
        String name = cur.getString(nameColumn);
        String phoneNumber = cur.getString(phoneColumn);
    }


    4.  另外,还有几个己知的子类,分别为:


    AbstractWindowedCursor
    CrossProcessCursor
    CursorWrapper
    MatrixCursor
    MergeCursor
    MockCursor
    SQLiteCursor


    5. 可以参考Android源码中的RingtoneManager.java(属于framework层), SoundRecorder应用程序来理解,看看它们是如何运用的。
    网上另一篇
    cursor查询、更新本地数据库的操作吧。先举个例子:
     
    Cursor c = getContentResolver.query(uri , String[ ] , where , String[ ] , sort);
    这条语句相信大家一定经常看到用到,查看sdk帮助文档也很容易找到其中五个参数的意思
    第一个参数:是一个URI,指向需要查询的表;
    第二个参数:需要查询的列名,是一个数组,可以返回多个列;
    第三个参数:需要查询的行,where表示需要满足的查询条件,where语句里面可以有?号;
    第四个参数:是一个数组,用来替代上面where语句里面的问号;
    第五个参数:表示排序方式;
    下面还是用一段代码来加强下印象:


    Cursor c = getContentResolver.query(Message.Content_URI ,
    new String[]{SyncColumns.Server_Id} , SyncColumns.Id+"=?" ,  new String[]{Long.toString(MessageId)} , null);
    try {
        if(c.moveToFirst()) {
            return c.getString(0);//0表示返回的行数
        }
        else {
            return null;
        }
    }
    finally {
        c.close();
    }
    下面再来看一段更新数据库的操作:

    ContentValues cv = new ContentValues();
    cv.put(Body.HTML_Content, newHtmlBody);//第一个参数是列名,第二个参数是要放入的值
    String where = Body.Message_Key + "=" + mMessageId;
    getContentResolver().update(uri , cv , where , null);
    //这里的四个参数应该很清楚了,uri是表,cv上面要更新的值,where是搜索行的语句,null是历史记录可以为空

    展开全文
  • 数据库中cursor游标的概念

    万次阅读 2016-08-19 11:29:26
    游标(cursor)  游标是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果  每个游标区都有一个名字  用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理  主语言是...

    游标(cursor)

      游标是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果

      每个游标区都有一个名字

      用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理

      主语言是面向记录的,一组主变量一次只能存放一条记录

      仅使用主变量并不能完全满足SQL语句向应用程序输出数据的要求

      嵌入式SQL引入了游标的概念,用来协调这两种不同的处理方式

      在数据库开发过程中,当你检索的数据只是一条记录时,你所编写的事务语句代码往往使用SELECT INSERT 语句。但是我们常常会遇到这样情况,即从某一结果集中逐一地读取一条记录。那么如何解决这种问题呢?游标为我们提供了一种极为优秀的解决方案。

      1.游标和游标的优点

      在数据库中,游标是一个十分重要的概念。游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标总是与一条SQL 选择语句相关联因为游标由结果集(可以是零条、一条或由相关的选择语句检索出的多条记录)和结果集中指向特定记录的游标位置组成。当决定对结果集进行处理时,必须声明一个指向该结果集的游标。如果曾经用 C 语言写过对文件进行处理的程序,那么游标就像您打开文件所得到的文件句柄一样,只要文件打开成功,该文件句柄就可代表该文件。对于游标而言,其道理是相同的。可见游标能够实现按与传统程序读取平面文件类似的方式处理来自基础表的结果集,从而把表中数据以平面文件的形式呈现给程序。

      我们知道关系数据库管理系统实质是面向集合的,在MS SQL SERVER 中并没有一种描述表中单一记录的表达形式,除非使用where 子句来限制只有一条记录被选中。因此我们必须借助于游标来进行面向单条记录的数据处理。由此可见,游标允许应用程序对查询语句select 返回的行结果集中每一行进行相同或不同的操作,而不是一次对整个结果集进行同一种操作;它还提供对基于游标位置而对表中数据进行删除或更新的能力;而且,正是游标把作为面向集合的数据库管理系统和面向行的程序设计两者联系起来,使两个数据处理方式能够进行沟通。

      2. 游标种类

      MS SQL SERVER 支持三种类型的游标:Transact_SQL 游标,API 服务器游标和客户游标。

      (1) Transact_SQL 游标

      Transact_SQL 游标是由DECLARE CURSOR 语法定义、主要用在Transact_SQL 脚本、存储过程和触发器中。Transact_SQL 游标主要用在服务器上,由从客户端发送给服务器的Transact_SQL 语句或是批处理、存储过程、触发器中的Transact_SQL 进行管理。 Transact_SQL 游标不支持提取数据块或多行数据。

      (2) API 游标

      API 游标支持在OLE DB, ODBC 以及DB_library 中使用游标函数,主要用在服务器上。每一次客户端应用程序调用API 游标函数,MS SQL SEVER 的OLE DB 提供者、ODBC驱动器或DB_library 的动态链接库(DLL) 都会将这些客户请求传送给服务器以对API游标进行处理。

      (3) 客户游标

      客户游标主要是当在客户机上缓存结果集时才使用。在客户游标中,有一个缺省的结果集被用来在客户机上缓存整个结果集。客户游标仅支持静态游标而非动态游标。由于服务器游标并不支持所有的Transact-SQL 语句或批处理,所以客户游标常常仅被用作服务器游标的辅助。因为在一般情况下,服务器游标能支持绝大多数的游标操作。由于API 游标和Transact-SQL 游标使用在服务器端,所以被称为服务器游标,也被称为后台游标,而客户端游标被称为前台游标。在本章中我们主要讲述服务器(后台)游标

      游标详细说明:

      RS.OPEN SQL,CONN,A,B

      参数A为设定游标的类型,其取值为:

      0 仅向前游标,只能向前浏览记录,不支持分页、Recordset、BookMark

      1 键集游标,其他用户对记录说做的修改将反映到记录集中,但其他用户增加或删除记录不会反映到记录集中。支持分页、Recordset、BookMark

      2 动态游标功能最强,但耗资源也最多。用户对记录说做的修改,增加或删除记录都将反映到记录集中。支持全功能浏览。

      3 静态游标,只是数据的一个快照,用户对记录说做的修改,增加或删除记录都不会反映到记录集中。支持向前或向后移动

      参数B为记录集的锁定类型,其取值为:

      1 锁定类型,默认的,只读,不能作任何修改

      2 当编辑时立即锁定记录,最安全的方式

      3 只有在调用Update方法时才锁定记录集,而在此前的其他操作仍可对当前记录进行更改、插入和删除等

      4 当编辑时记录不会被锁定,而更改、插入和删除是在批处理方式下完成的

      打开数据记录集方法其实不止一种,但是我们用的最多的就是

      rs.open sql,1,1的方法,可是后面的数字参数很多人不解其意,下面我们来介绍一下。

      其实open方法后面有多个参数

      CursorType LockType CommandType

      比如 rs.open sql,1,1

      也可以写成

      rs.cursorType = 1

      rs.LockType = 1

      rs.open sql

      其中CursorType代表从一个表或者一个SQL查询结果返回的记录。

      这个参数有四个值分别是:

      adOpenForwardOnly 表示只允许在记录集内的记录间往前移动。这个是缺省值。

      adOpenKeyset 反映由其它用户所做的对记录的改变或者删除动作,但并不反映由其它用户做作的添加新记录的动作。

      adOpenDynamic 反映由其它用户所做的对记录的改变或者删除动作,包括添加的新记录

      adOpenStatic 不反映其它用户对记录所做的修改,添加,删除动作。

      这四个值VBSCRIPT预定义位

      adOpenForwardOnly = 0

      adOpenKeyset = 1

      adOpenDynamic = 2

      adOpenStatic = 3

      lockType 表示当打开记录集时,数据提供者用于锁定数据库的类型:

      adLockReadOnly 数据不能改变,这是缺省值!

      adLockPessimistic 数据提供者在开始编辑数据的时候锁定记录

      adLockOptimistic 仅当调用update方法时,数据提供者锁定记录

      adLockBatchOptimistic 用于批处理修改

      他们的常量值定义分别是:

      adLockReadOnly = 1

      adLockPessimistic = 2

      adLockOptimistic = 3

      adLockBatchOptimistic = 4

      rs.open sql,conn,1,1 读取记录 select

      rs.open sql,conn,1,3 只更新记录最好 update

      rs.open sql,conn,2,3 插入和删除最好 insert delete

    下面的解释:

    1. 什幺是游标?

    游标,也有人称为光标。概括的讲,它是基于记录的。

    过去,关系型数据库没有象现在这样被广泛的应用。那时候,人们大多使用 dBase 这样的小型数据库软件。这类数据库确切的说应为数据文件管理软件。他们是面向记录的。

    不过,这种方式也许更符合人们的习惯。比如,我们在电话本中查找号码,在学生档案中查找档案,最终都要归结于其中的一个号码,一个档案,那就是一条记录。现实生活中,我们在一张表格中寻找某一项时,可能会用手一条一条逐行的扫过,以帮助我们找到所需的那条记录。对应于数据库来说,这就是游标的模型。所以,你可以这样想象:表格是数据库中的表,而我们的手好比是游标。

    所以,当你使用类似 .MoveNext,.MoveLast 这样的语句时,觉得再自然不过了。

    现在,你明白什幺是游标了吧。游标就是数据的 ' 定位系统 ' 。

    这个 ' 定位系统 ' 粗分有两种:服务器游标和客户游标。对应于 ADO 中的 CursorLocation 。举例来说:

    Set rs = Server.CreateObject("ADODB.RecordSet")
    rs.CursorLocation = adUseServer      '缺省,使用服务器游标
    .....
    rs.CursorLocation = adUseClient      '使用客户游标

    2. 什幺是服务器游标?

    或者称为 API 服务器游标。

    假设你要查询有关编程语言的书,写成 SQL 语句就是:SELECT book_id,book_title FROM books WHERE book_catalog = '编程' ORDER BY book_title,同时你指定使用服务器游标。

    这条语句发送到服务器,服务器对数据进行检索,将符合查询条件的记录集合放入临时表(对某些游标类型是这样)中。每当你进行 .MoveNext 操作,服务器就会发送一条记录到客户端的缓冲区,然后你才可以使用它。

    3. 什幺是 CacheSize ?

    继续上面的例子,假设符合查询条件的记录有100个,也就是说,用 .MoveNext 这种方法遍历该结果集需要同服务器交互100次。我们可以通过设置 CacheSize 使客户与服务器的通信变少。上面的例子其实就是 CacheSize=1 的情况,这是缺省值。

    假设 CacheSize=4,当 RecordSet 对象打开时,服务器发送4条记录到客户端。前4次的 .MoveNext 操作实际上是在客户缓冲区中得到数据,当第5次 .Movenext 时,服务器才发送下一个4条记录。由此,减少了客户与服务器间的网络通信。

    那幺是不是说 CacheSize 越大越好呢?千万不要想当然。万事都有两面性,CacheSize 也一样。客户端请求数据,服务器发送数据,这个过程有点象交通管理。CacheSize 过高,会阻塞交通,甚至引起数据丢失(比如当 Cachesize 大于客户端缓冲区时)。对于不同的应用,所取的值也不同。

    另外要指出的是,使用任何形式的游标都不是最有效的访问数据的方法,Cachesize 有的时候并不是瓶颈,尽量将使用游标的程序转换为面向结果集的程序,性能会提高很多。

    3. 什幺是客户游标?

    既然游标是数据的 ' 定位系统 ',那幺在客户端也可以完成。

    客户游标的产生由来已久,当初是为了弥补服务器的不足(有些数据库引擎就不支持游标)。随着服务器游标的出现,客户游标似乎已经过时了,不过还是那句话:万事都有两面性,在 internet 上,与数据库的连接并不是永久的,使用客户游标能使我们获得同使用服务器游标一样的功能。

    当 CursorLoction 属性设成 adUseClient 时,微软的游标服务( Cursor Service )创建 RecordSet 对象,用前向 / 只读的游标方式从服务器将所有查询结果检索出来,并且存储在客户缓冲区中。当应用程序通过 ADO 请求数据时,游标服务就从客户缓冲区中检取数据。这种方式在连接远程服务器时非常有用,它会提高应用程序的性能。如果你访问的数据库是 Jet 数据库( Access ),而且在本地,那么用客户游标非但不提高性能,还会使性能下降。这时候,数据将被缓存两次,数据库一次,游标服务一次。

    如果考虑应用的功能,客户游标功能是很完善的,它能支持某些数据库不能完成的操作( 视数据库的情况而定 )。

    4. 什幺是 DisConnected RecordSet ?

    我们使用了客户游标,就可以断开与数据库的连接,释放 Connection 对象。这样的结果集就是 DisConnected RecordSet。举例说明:

    Dim c As New ADODB.Connection
    Dim r As New ADODB.Recordset
    On Error GoTo handler
       
    c.ConnectionString = connectStr
    c.CursorLocation = adUseClient
    c.Open
    Set r.ActiveConnection = c
    r.Open SqlText, , adOpenKeyset, adLockBatchOptimistic, -1
    Set r.ActiveConnection = Nothing   ' This disconnects the recordset.
    c.Close
    Set c = Nothing
    ......
    ......   
    ' Recordset is now in disconnected state; do something with it.
    r.Close
    Set r = Nothing

    展开全文
  • Oracle Cursor详解与实例

    千次阅读 2014-02-27 12:52:05
    摘要:详细介绍oracle数据库中关于游标的定义和使用。通过实例操作来深入了解cursor的用法和用处。
  • sql 中CURSOR 的使用

    万次阅读 2018-04-13 10:49:48
    CURSOR是游标,常用于脚本处理。这里主要介绍自己常用的方法,同时也会把网上的一般格式进行解释。一、游标一般格式:DECLARE 游标名称 CURSOR FOR SELECT 字段1,字段2,字段3,... FROM 表名 WHERE ...OPEN 游标名称...
  • mysql cursor使用

    万次阅读 2017-04-11 11:09:26
    一,什么是游标(cursor) 个人觉得就是一个cursor,就是一个标识,用来标识数据去到什么地方了。你也可以把它理解成数组中的下标。 二,游标(cursor)的特性 1,只读的,不能更新的。 2,不滚动的 3,不敏感的,不敏感意...
  • Cursor

    2019-08-16 12:50:19
    Mac安装使用Mysql教程(从零开始) 第一章 Mac安装MySQL 1.1 过程记录 1.2 参考 第二章 安装数据库管理软件DBeaver 2.1 过程记录 2.2 参考 第三章 DBeaver创建MySQL数据库 3.1 过程记录 ...4.3 登录My...
  • 一:Cursor到底是什么? 网上很多博客都介绍了Cursor,介绍了各种概念,各种原理。可是有的小伙伴可能还是很懵逼,这特码的到底都是什么。 刚开始接触Cursor的时候也是一脸懵逼,看到人家说这个方法是在干什么干什么...
  • 4.pymysql .cursor属性方法(tcy)

    万次阅读 2019-01-27 13:04:25
    Cursor 普通的游标对象,默认创建的游标对象 SSCursor 不缓存游标,主要用于当操作需要返回大量数据的时候 DictCursor 以字典的形式返回操作结果 SSDictCursor 不缓存游标,将...
  • Android Cursor遍历

    万次阅读 多人点赞 2012-08-02 11:57:25
    public List getAllPoints() { String sql = "select * from points"; SQLiteDatabase db = helper.getWritableDatabase(); List pointList = new ArrayList(); PointBean point = null;... Cursor cursor =
  • 遍历cursor对象:

    千次阅读 2012-09-10 14:32:06
    遍历cursor对象:  Cursor cursor=dbHelp.selectData(String.valueOf(arg2+1)); for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { cursor.getString(cursor.getColumnIndex
  • cursor禁止默认样式

    千次阅读 2018-06-14 12:15:34
    cursor: not-allowed; 注意: 如果没有效果, pointer-events: none;
  • 问题:当时刚接触sqlite和contentProvider时候记得cursor初始位置不正确 所以要moveToFirst 才能使cursor正确指向第一个位置。那么问题来了,遍历的时候要用moveToNext(在我印象中是同时使用的),所以脑海中默认...
  • 开始cursor.execute(''.join(str(sql).strip())) #count= cursor.rowcount; num=cursor.rownumber修改后:cursor.execute(''.join(str(sql).strip())) cursor.fetchall(); #count= cursor.rowcount; num=cursor.row...
  • 出现java.lang.NoClassDefFoundError: org/apache/ibatis/cursor/Cursor 错误! 说明是版本兼容问题,解决办法:mybatis的3.4.0及以上版本用mybatis-spring1.3.0及以上版本;mybatis的3.4.0以下版本用m
  • postgresql对于各种游标的使用示例

    万次阅读 2015-03-13 15:23:24
    postgresql、refcursorcursor、loop、exit、continue
  • C#中操作鼠标对象Cursor

    万次阅读 2006-09-13 12:19:00
    改变鼠标指针形状: Cursor.Current = Cursors.WaitCursor; try { .. do some work .. } finally { Cursor.Current = Cursors.Default; } 相关网址:...
  • Android中cursor.getInt()返回值的坑

    万次阅读 2015-07-16 16:31:28
    Andorid里Cursor类的getInt()方法,当数据为null的时候返回值是0,被坑了好几次了~ 为了避免将null和0混淆,也可以用getString()代替。 下面是一个老外写的,原文地址: http://datacymru.net/netstat/?p=61 ...
  • Python 数据库的Connection、Cursor两大对象

    万次阅读 多人点赞 2017-01-03 14:21:51
    Python 数据库图解流程 Connection、Cursor比喻 Connection()的参数列表host,连接的数据库服务器主机名,默认为本地主机(localhost)。 user,连接数据库的用户名,默认为当前用户。 passwd,连接密码,没有默认值。...
1 2 3 4 5 ... 20
收藏数 390,818
精华内容 156,327
关键字:

cursor