隐含游标:专门处理SELECT INTO、INSERT、UPDATE以及DELETE语句。

显示游标:用于处理多行的SELECT语句。

当在PL/SQL块中执行INSERT、UPDATE及DELETE语句时,为了取得DML语句作用的结果,需要使用SQL游标属性。

第一,游标的4种属性 1. SQL%ISOPEN

该属性永远都是false,没有实际意义。 2. SQL%FOUND

语句是否操作成功。当SQL语句有作用行时为TRUE. 3. SQL%NOTFOUND

LOOP FETCH  emp_cursor  INTO   v_name, v_deptno;

EXIT  WHEN  emp_cursor%NOTFOUND; ...

END LOOP;

4. SQL%ROWCOUNT

返回SQL语句所作用的总计行数。

该属性用于返回已提取的实际行数。

第二,显示游标专用于处理SELECT语句返回的多行数据。 定义游标: CURSOR  cursor_name  IS  select_statement; 打开游标: open  cursor_name; 提到数据: FETCH  cursor_name  INTO  var1[, var2, ...]; 关闭游标: CLOSE  cursor_name;

例子:

DECLARE

CURSOR category_cursor

IS

SELECT *

FROM tb_out_service t

WHERE t.servicename LIKE '长沙%';

TYPE category_table_type IS TABLE OF tb_out_service%ROWTYPE

INDEX BY BINARY_INTEGER;

category_table   category_table_type;

i                INT;

BEGIN

OPEN category_cursor;

LOOP

i := category_cursor%ROWCOUNT + 1;

FETCH category_cursor

INTO category_table (i);

EXIT WHEN category_cursor%NOTFOUND;

DBMS_OUTPUT.put_line (   RPAD (category_table (i).serviceid, 30)

|| '  '

|| category_table (i).servicename

);

END LOOP;

CLOSE category_cursor;

END;

第三,游标FOR循环

语法:

FOR  record_name  IN  cursor_name  LOOP statement;

...

END  LOOP;

注意:当使用游标FOR循环时,既可以在定义部分定义游标,也可以直接在FOR循环中使用SELECT语句。

第四,参数游标

CURSOR cursor_name(parameter_name datatype) is select_statement;

OPEN cursor_name(parameter_value)

注意:

定义参数只能指定数据类型,不能指定长度。

另外,应该在游标的select语句的where子句中引用游标参数,否则失去了定义参数游标的意义。

---------------------------------------------------------------------------------------------------------------------

DECLARE

CURSOR category_cursor (NAME VARCHAR2)

IS

SELECT *

FROM tb_out_service t

WHERE t.servicename LIKE NAME || '%';

BEGIN

FOR category_record IN category_cursor ('吉首')

LOOP

DBMS_OUTPUT.put_line (   RPAD (category_record.serviceid, 30)

|| '  '

|| category_record.servicename

);

END LOOP;

END;

第五,更新或删除游标行

语法:

CURSOR cursor_name IS select_statement FOR UPDATE [OF column_reference]  [NOWAIT];

UPDATE table_name SET column=..  WHERE CURRENT OF cursor_name;

DELETE FROM table_name WHERE CURRENT OF cursor_name;

注意: 1. OF子句的格式:column_reference为table_name.column_name

2. WHERE CURRENT OF cursor_name, 更新或者删除游标所在行的数据。 3. 在使用游标更新或删除数据时,定义游标必须带有FOR  UPDATE子句,并且在更新或者删除游标时必须带有WHERE CURRENT OF 子句。

当查询语句涉及到多张表时,如果不带有OF子句,会在多张表上同时加锁,如果只在特定的表上加锁,需要带有OF子句。

DECLARE

CURSOR category_cursor (NAME VARCHAR2)

IS

SELECT        *

FROM tb_out_service t

WHERE t.servicename LIKE NAME || '%'

FOR UPDATE OF t.querystr;

v_name   CONSTANT VARCHAR2 (20) := '长沙';

BEGIN

FOR category_record IN category_cursor (v_name)

LOOP

IF INSTR (category_record.servicename, v_name || '——') <> 1

THEN

DBMS_OUTPUT.put_line (   'delete: '

|| RPAD (category_record.serviceid, 30)

|| '  '

|| category_record.servicename

);

DELETE FROM tb_out_service

WHERE CURRENT OF category_cursor;

ELSE

DBMS_OUTPUT.put_line (   'upate: '

|| RPAD (category_record.serviceid, 30)

|| '  '

|| category_record.servicename

);

UPDATE tb_out_service t

SET t.querystr = v_name || '——' || t.servicename

WHERE CURRENT OF category_cursor;

END IF;

END LOOP;

END;

第六, 游标变量 游标变量是基于REF CURSOR类型所定义的变量,它实际上是指向内存地址的指针。显式游标只能定义静态游标,而游标变量可以在打开时指定其所对应的SELECT语句,从而实现动态游标。 定义游标: TYPE  ref_type_name  IS  REF  CURSOR  [RETURN  return_type];

cursor_variable  ref_type_name; 打开游标: OPEN  cursor_name  FOR  select_statement; 提到数据: FETCH  cursor_variable  INTO  var1[, var2, ...]; 关闭游标: CLOSE  cursor_variable;

注意: 不能在远程子程序中使用游标变量。

当指定子查询时,不能带有FOR UPDATE子句。

当指定RETURN子句时,返回类型必须使用PL/SQL记录类型。

例子:

DECLARE

TYPE category_cursor_type IS REF CURSOR

RETURN tb_out_service%ROWTYPE;

category_cursor   category_cursor_type;

category_record   tb_out_service%ROWTYPE;

v_name   CONSTANT VARCHAR2 (40)            := '长沙';

BEGIN

OPEN category_cursor FOR

SELECT *

FROM tb_out_service t

WHERE t.servicename LIKE v_name || '%';

LOOP

FETCH category_cursor

INTO category_record;

EXIT WHEN category_cursor%NOTFOUND;

DBMS_OUTPUT.put_line (   RPAD (category_record.serviceid, 30)

|| '  '

|| category_record.servicename

);

END LOOP;

END;

posted on 2009-03-17 11:07 JavaBegger 阅读(557) 评论(0)  编辑  收藏

java中sql去除游标_SQL游标 - java.beggar - BlogJava相关推荐

  1. java中sql去除游标_java.sql.SQLException:-ORA-01000:已超过最大打开游标

    小编典典 ORA-01000(最大打开游标错误)是Oracle数据库开发中极为常见的错误.在Java上下文中,当应用程序尝试打开比数据库实例上配置的游标更多的ResultSet时,就会发生这种情况. ...

  2. Java中SQL动态封装工具类--Java自学网

    package com.javalearns.util; import java.util.ArrayList; import java.util.Collection; import java.ut ...

  3. java中list去除空值_Java –从列表中删除所有空值

    java中list去除空值 介绍: 在本文中,我们将学习如何使用普通的Java,Java 8 lambda表达式和某些第三方库从Java 列表中删除空值 . 所以,让我们开始吧! 从Java中的 让我 ...

  4. java中sql语句_java中sql语句的编写规则

    java中sql语句的编写规则 发布时间:2020-06-26 15:11:11 来源:亿速云 阅读:143 作者:Leah 这期内容当中小编将会给大家带来有关java中sql语句的编写规则,文章内容 ...

  5. Java中SQL语句的拼接规则

    拼接规则示例 java中的字符串只能双引号,如果字符串中需要拼接变量,该变量用单引号括起来,然后加两个双引号再加两个加号,中间就是变量. 例如:查询数据库中的用户名和密码. 注:为和sql表中的use ...

  6. Java中的Volatile如何工作? Java中的volatile关键字示例

    如何在Java中使用Volatile关键字 在Java采访中,什么是volatile变量以及何时在Java中使用volatile变量是Java 采访中一个著名的多线程采访问题 . 尽管许多程序员都知道 ...

  7. java 中的排序_浅谈java中常见的排序

    浅谈java中常见的排序 学过java的人都知道,排序这一部分初次接触感觉还是有点难以理解,很多地方也会用到.然而,在java中常见的排序方法:冒泡排序,选择排序,插入排序等等.下面就让我们一起揭开他 ...

  8. java中sql语句怎么把开始和结束时间作为参数写sql查询_聊一聊MyBatis 和 SQL 注入间的恩恩怨怨

    整理了一些Java方面的架构.面试资料(微服务.集群.分布式.中间件等),有需要的小伙伴可以关注公众号[程序员内点事],无套路自行领取 引言 MyBatis 是一种持久层框架,介于 JDBC 和 Hi ...

  9. java中sql语句怎么把开始和结束时间作为参数写sql查询_java程序员跳槽的一道坎,大公司面试官都会问的Mybatis...

    一.什么是Mybatis? 1. Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动.创建连接.创建statement ...

  10. java中sql删除姓王的数据_JDBC删除数据实例

    在本教程将演示如何在JDBC应用程序中,删除数据库表中数据记录. 在执行以下示例之前,请确保您已经准备好以下操作: 具有数据库管理员权限,以在给定模式的数据库表中删除数据记录. 要执行以下示例,需要用 ...

最新文章

  1. Shell按行读取文件的3种方法
  2. Visual Studio 2019 preview中体验C# 8.0新语法
  3. 阿里宜搭发布专有云版本,基于云原生的应用构建PaaS平台
  4. oracle互换2条记录,ORACLE中确定表里哪些行是彼此互换的
  5. savefiledialog对话框的取消和确定按钮分别返回一个什么值?_确定按钮该放在左边还是右边?...
  6. Spring基础类型注入演示案例
  7. 将vue项目打包部署到云服务器(傻瓜式宝塔面板)
  8. 在WPF中自定义你的绘制(二)
  9. 学籍成绩管理系统c语言,学籍成绩管理系统UCDOS操作系统下C语言版本课程设计).doc...
  10. 认知学派用计算机来比拟人,比拟:把人当物写或把物当人来写的一种修辞方法,前者称之为拟物,后者称之为拟人.如:①做人既不可翘尾巴,也不可夹着尾巴. ②蜡炬成灰泪始干....
  11. excel在线_图片转Excel表格在线工具,分享几款不错的工具
  12. 为什么python打不开_Python打不开.py文件
  13. 4.2 Hive SQL
  14. linux基础命令之一
  15. Java学习体系(骨灰级详细)
  16. 超云服务器 节能清单,探秘超云R9110/R9160服务器高温节能之迷
  17. 抖音视频怎样伪原创 视频剪辑md5值
  18. “360画报”功能导致帐户锁定
  19. 视频转动图怎么做,教你一招搞定
  20. 结构光系统标定(三)基于多项式拟合的结构光系统标定

热门文章

  1. emv交易流程介绍,简易波动指标EMV基础知识介绍:EMV的计算公式_EMV应用法则
  2. 一文了解:微服务及其演进史
  3. 逆矩阵的六个注意事项
  4. android入门之Activity 后台启动限制
  5. 深入Golang Runtime之Golang GC的过去,当前与未来
  6. 如何查看网站的访问量?查看访问量的二个主要方法【站长之家的SEO综合查询工具】
  7. 5款网页版思维导图工具测评
  8. matlab中建立变换器模型,基于Simulink/Matlab的DC-DC变换器系统仿真
  9. 基于servlet+jsp 个人博客系统
  10. 软件测试工作效率的衡量标准,软件测试人员绩效工作考核详细(33页)-原创力文档...