Oracle中cursor学习

痛定思痛。 2022-05-08 02:42 253阅读 0赞

参考文章:Oracle中Cursor介绍和使用

什么是cursor

好吧,我也没有他的定义,网上找也没找到,若有大侠有比较好的解释还请不吝赐教。

说说现在的理解吧:cursor游标,和它对应java中的对象是ResultSet,可以理解为一个map的数组,或者说想json数组,感觉应该是长这样的

  1. {
  2. {name:'张三',sex:'男',age:20},
  3. {name:'李四',sex:'女',age:18}
  4. }

简单用法

  1. declare
  2. cursor mycur is
  3. select t_user.user_name,t_user.user_sex,t_user.user_age from t_user;
  4. begin
  5. for i in mycur
  6. loop
  7. Dbms_Output.put_line('姓名:'||i.user_name||'性别:'||i.user_sex||' 年龄:'||i.user_age);
  8. end loop;
  9. exception
  10. when others then
  11. dbms_output.put_line(sqlerrm);
  12. end;

再看一例子

  1. DECLARE
  2. CURSOR emp_cur IS
  3. SELECT employee_id
  4. FROM employees
  5. WHERE salary > 3000
  6. AND job_id = 'ST_CLERK'
  7. FOR UPDATE OF salary NOWAIT;
  8. c_row NUMBER;
  9. BEGIN
  10. IF NOT emp_cur%ISOPEN THEN
  11. OPEN emp_cur;
  12. END IF;
  13. LOOP
  14. FETCH emp_cur
  15. INTO c_row;
  16. EXIT WHEN emp_cur%NOTFOUND;
  17. UPDATE employees SET salary = salary * 1.1 WHERE CURRENT OF emp_cur;
  18. END LOOP;
  19. COMMIT;
  20. dbms_output.put_line('update complete');
  21. EXCEPTION
  22. WHEN OTHERS THEN
  23. dbms_output.put_line(SQLERRM);
  24. ROLLBACK;
  25. end;

参数:在使用游标的时候,游标会产生四个属性:%found、%notfound、%isopen 和%rowcount,下面以隐式游标为例来看下游标属性的使用方法。

  1. BEGIN
  2. --update 语句会产生一个游标,我们会获取到相应的游标属性
  3. UPDATE cux_cursor_test t SET t.age = 30 WHERE t.person_name = 'Herry';
  4. IF SQL%FOUND THEN
  5. dbms_output.put_line('Herry 更新了几条记录:' || SQL%ROWCOUNT);
  6. ELSIF SQL%NOTFOUND THEN
  7. dbms_output.put_line('Herry 在表中不存在');
  8. END IF;
  9. --delete 语句会产生一个游标,我们会获取到相应的游标属性
  10. DELETE cux_cursor_test p WHERE p.person_name = 'Abc';
  11. IF SQL%FOUND THEN
  12. dbms_output.put_line('Abc 删除了几条记录' || SQL%ROWCOUNT);
  13. ELSIF SQL%NOTFOUND THEN
  14. dbms_output.put_line('Abc 在表中不存在');
  15. END IF;
  16. --insert 语句会产生一个游标,我们会获取到相应的游标属性
  17. INSERT INTO cux_cursor_test
  18. VALUES
  19. (103,
  20. 'Peter',
  21. 28);
  22. IF SQL%FOUND THEN
  23. dbms_output.put_line('Peter 插入了几条记录:' || SQL%ROWCOUNT);
  24. ELSIF SQL%NOTFOUND THEN
  25. dbms_output.put_line('无数据可以插入');
  26. END IF;
  27. END;

%rowcount r它随每次fetch而累计:

参考文章

%notfound:It returns TRUE if an INSERT, UPDATE, or DELETE statement affected no rows, or a SELECT INTO statement returned no rows. Otherwise, it returns FALSE.

参考文章

发表评论

表情:
评论列表 (有 0 条评论,253人围观)

还没有评论,来说两句吧...

相关阅读

    相关 oracleREF Cursor用法

    1,什么是 REF游标 ?  动态关联结果集的临时对象。即在运行的时候动态决定执行查询。   2,REF 游标 有什么作用?  实现在程序间传递结果集的功能,利

    相关 Oracle Cursor介绍

    一 概念 游标是SQL的一个内存工作区,由系统或用户以变量的形式定义。游标的作用就是用于临时存储从数据库中提取的数据块。在某些情况下,需要把数据从存放在磁盘的表中调到计算机