java中sql去除游标_SQL游标 - java.beggar - BlogJava
隐含游标:专门处理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相关推荐
- java中sql去除游标_java.sql.SQLException:-ORA-01000:已超过最大打开游标
小编典典 ORA-01000(最大打开游标错误)是Oracle数据库开发中极为常见的错误.在Java上下文中,当应用程序尝试打开比数据库实例上配置的游标更多的ResultSet时,就会发生这种情况. ...
- Java中SQL动态封装工具类--Java自学网
package com.javalearns.util; import java.util.ArrayList; import java.util.Collection; import java.ut ...
- java中list去除空值_Java –从列表中删除所有空值
java中list去除空值 介绍: 在本文中,我们将学习如何使用普通的Java,Java 8 lambda表达式和某些第三方库从Java 列表中删除空值 . 所以,让我们开始吧! 从Java中的 让我 ...
- java中sql语句_java中sql语句的编写规则
java中sql语句的编写规则 发布时间:2020-06-26 15:11:11 来源:亿速云 阅读:143 作者:Leah 这期内容当中小编将会给大家带来有关java中sql语句的编写规则,文章内容 ...
- Java中SQL语句的拼接规则
拼接规则示例 java中的字符串只能双引号,如果字符串中需要拼接变量,该变量用单引号括起来,然后加两个双引号再加两个加号,中间就是变量. 例如:查询数据库中的用户名和密码. 注:为和sql表中的use ...
- Java中的Volatile如何工作? Java中的volatile关键字示例
如何在Java中使用Volatile关键字 在Java采访中,什么是volatile变量以及何时在Java中使用volatile变量是Java 采访中一个著名的多线程采访问题 . 尽管许多程序员都知道 ...
- java 中的排序_浅谈java中常见的排序
浅谈java中常见的排序 学过java的人都知道,排序这一部分初次接触感觉还是有点难以理解,很多地方也会用到.然而,在java中常见的排序方法:冒泡排序,选择排序,插入排序等等.下面就让我们一起揭开他 ...
- java中sql语句怎么把开始和结束时间作为参数写sql查询_聊一聊MyBatis 和 SQL 注入间的恩恩怨怨
整理了一些Java方面的架构.面试资料(微服务.集群.分布式.中间件等),有需要的小伙伴可以关注公众号[程序员内点事],无套路自行领取 引言 MyBatis 是一种持久层框架,介于 JDBC 和 Hi ...
- java中sql语句怎么把开始和结束时间作为参数写sql查询_java程序员跳槽的一道坎,大公司面试官都会问的Mybatis...
一.什么是Mybatis? 1. Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动.创建连接.创建statement ...
- java中sql删除姓王的数据_JDBC删除数据实例
在本教程将演示如何在JDBC应用程序中,删除数据库表中数据记录. 在执行以下示例之前,请确保您已经准备好以下操作: 具有数据库管理员权限,以在给定模式的数据库表中删除数据记录. 要执行以下示例,需要用 ...
最新文章
- Shell按行读取文件的3种方法
- Visual Studio 2019 preview中体验C# 8.0新语法
- 阿里宜搭发布专有云版本,基于云原生的应用构建PaaS平台
- oracle互换2条记录,ORACLE中确定表里哪些行是彼此互换的
- savefiledialog对话框的取消和确定按钮分别返回一个什么值?_确定按钮该放在左边还是右边?...
- Spring基础类型注入演示案例
- 将vue项目打包部署到云服务器(傻瓜式宝塔面板)
- 在WPF中自定义你的绘制(二)
- 学籍成绩管理系统c语言,学籍成绩管理系统UCDOS操作系统下C语言版本课程设计).doc...
- 认知学派用计算机来比拟人,比拟:把人当物写或把物当人来写的一种修辞方法,前者称之为拟物,后者称之为拟人.如:①做人既不可翘尾巴,也不可夹着尾巴. ②蜡炬成灰泪始干....
- excel在线_图片转Excel表格在线工具,分享几款不错的工具
- 为什么python打不开_Python打不开.py文件
- 4.2 Hive SQL
- linux基础命令之一
- Java学习体系(骨灰级详细)
- 超云服务器 节能清单,探秘超云R9110/R9160服务器高温节能之迷
- 抖音视频怎样伪原创 视频剪辑md5值
- “360画报”功能导致帐户锁定
- 视频转动图怎么做,教你一招搞定
- 结构光系统标定(三)基于多项式拟合的结构光系统标定
热门文章
- emv交易流程介绍,简易波动指标EMV基础知识介绍:EMV的计算公式_EMV应用法则
- 一文了解:微服务及其演进史
- 逆矩阵的六个注意事项
- android入门之Activity 后台启动限制
- 深入Golang Runtime之Golang GC的过去,当前与未来
- 如何查看网站的访问量?查看访问量的二个主要方法【站长之家的SEO综合查询工具】
- 5款网页版思维导图工具测评
- matlab中建立变换器模型,基于Simulink/Matlab的DC-DC变换器系统仿真
- 基于servlet+jsp 个人博客系统
- 软件测试工作效率的衡量标准,软件测试人员绩效工作考核详细(33页)-原创力文档...