存储过程使用游标变量返回结果集

1)登录SQLPLUS,用户为SCOTT,利用该用户提供的表EMP

[sql]

C:/Users/Administrator>sqlplus scott/scott

2)编写一个FUNCTION,返回值为游标变量

[sql]

CREATE OR REPLACE FUNCTION GETEMPCURSOR(PRM_CHOICE IN NUMBER)

RETURN  SYS_REFCURSOR

IS

EMPCURSOR SYS_REFCURSOR;

BEGIN

IF PRM_CHOICE = 1 THEN

OPEN EMPCURSOR FOR SELECT * FROM EMP WHERE DEPTNO = 10;

ELSIF   PRM_CHOICE =2 THEN

OPEN EMPCURSOR FOR SELECT * FROM EMP WHERE DEPTNO = 20;

ELSIF  PRM_CHOICE =3 THEN

OPEN EMPCURSOR FOR SELECT * FROM EMP WHERE DEPTNO = 30;

ELSE

OPEN EMPCURSOR FOR SELECT * FROM EMP;

END IF;

RETURN EMPCURSOR;

END;

3)编写一个PLSQL块,调用上面的FUNCTION得到返回的游标变量

[sql]

DECLARE

EMPCURSOR SYS_REFCURSOR;

REC_EMP EMP%ROWTYPE;

BEGIN

EMPCURSOR := GETEMPCURSOR(10);

IF EMPCURSOR%ISOPEN THEN

LOOP

FETCH EMPCURSOR INTO REC_EMP;

EXIT WHEN EMPCURSOR%NOTFOUND;

DBMS_OUTPUT.PUT_LINE(‘‘||‘==>‘||REC_EMP.ENAME);

END LOOP;

END IF;

CLOSE EMPCURSOR;

END;

4)几点说明:

①有三种语句可以控制游标变量的使用,分别是OPEN FOR、FETCH还有CLOSE。其中OPEN用于打开游标变量。FETCH用于将游标变量中的数据存放到变量当中存储。CLOSE用于在遍历完成之后,关闭游标。

②使用游标的时候,可以将REF CURSOR指定为强类型或者弱类型(在定义的后面增加RETURN ROWTYPE的方式),如果指定为强类型,小心避免出现类型不匹配的错误。

③游标变量可以在应用于数据库服务器之间进行传递,可以在数据库内部进行传递。应用或者数据库本身不具备单独的变量存储空间,其游标变量其实就是一个指向内存的指针,实质上这些数据是共享的。

④能够将游标的四个属性%FOUND,%NOTFOUND,%ISOPEN以及%ROWCOUNT应用到游标变量中,用于判断游标变量的状态。

⑤可以使用FETCH一次获取一条记录,也可以使用FETCH BULK COLLECT INTO 一次获取一条或者多条放到一个或者多个集合类型中。

⑥不要忘记关闭游标。

ibatis  call

<resultMap type="********.AdvNushiMikomiInputExcelOutPutDto" id="advNushiMikomiInputExcelOutPutDto">
</resultMap>
<select id="selectAdvNushiMikomiInputExcelSumiNetMokoCursor" parameterType="map" statementType="CALLABLE">
<![CDATA[
{#{resultList, mode=OUT, jdbcType=CURSOR, javaType=java.sql.ResultSet, resultMap=advNushiMikomiInputExcelOutPutDto} = call GETSUMIMOKOCURSOR(
#{v_nengetsu,jdbcType=CHAR,mode=IN},
#{v_uriageBuKaCode,jdbcType=CHAR,mode=IN},
#{v_tantoBuKaCode,jdbcType=CHAR,mode=IN},
#{v_gyosyuMcode,jdbcType=CHAR,mode=IN},
#{v_advNushiCode,jdbcType=CHAR,mode=IN}
)}
]]>
</select>

接口

advNushiMikomiInputDao.selectAdvNushiMikomiInputExcelSumiNetMokoCursor(map);
List<AdvNushiMikomiInputExcelOutPutDto> advNushiMikomiInputExcelSumiNetMoko = (List<AdvNushiMikomiInputExcelOutPutDto>)map.get("resultList");

时间: 2024-10-31 05:21:52

存储过程使用游标变量返回结果集的相关文章

mybatis调用mysql存储过程返回结果集

存储过程中经常需要返回结果集. Mysql 中直接用 select 即可返回结果集.而 oracle 则需要使用游标来返回结果集.这一点 Mysql 相对比较方便,如下代码即可实现输出结果集: 存储过程定义: DELIMITER $$ DROP procedure IF EXISTS pro_sql_data1 $$ CREATE procedure pro_sql_data1(in sear_name varchar(2000)) BEGIN if sear_name is not null

C#中使用Oracle存储过程返回结果集

问题: 在MSSQLServer中定义的存储过程可以直接返回一个数据集,如: create procedure sp_getAllEmployees as SELECT * FROM [NORTHWND].[dbo].[Employees] 在Oracle数据库中这样定义是错误的,怎么解决? 办法: Oracle中可以使用游标(Cursor)对数据集进行操作,但在存储过程输出参数中直接使用Cursor错误,此时的Cursor应该是一个定义游标的关键字并非类型,所以先要定义一个包,在包中声明全局的

oracle创建存储过程并返回结果集(附C#调用代码)

使用存储过程中,最常用的莫过于查询数据表,并返回结果集. 在SQL SERVER 中,这类操作最简单,通过简单的select * from xx 即可完成.但是在Oracle中并不支持这种写法,那么我们怎么实现跟SQL SERVER同样的功能呢?且看以下代码: create or replace procedure sp_getdept (rep_type in varchar2,sel in varchar2,result out sys_refcursor) as seq varchar2(

Oracle在存储过程中如何返回结果集

Oracle和Sqlserver不一样的地方有很多. 个人最深的体会是存储过程返回结果集,在Sqlserver中直接select查询就行,Oracle就不行了. 这里,就用最简单的例子说明存储过程返回结果集的例子 CREATE OR REPLACE PROCEDURE 存储过程名( 字段名 in VARCHAR2, l_result OUT TYPES.RQ_REF_CURSOR -- 包里面方法名 ) is str_sql varchar2(8000) := ''; begin str_sql

存储过程不返回记录集导致ADO程序出错

HRESULT _hr = get_adoEOF(&_result); IsEOF()函数如下:其中ADOCG::_RecordsetPtr m_pRecordset; BOOL IsEOF()       {return m_pRecordset->adoEOF == VARIANT_TRUE;}; m_pRecordset->adoEOF 将执行下面的函数(见msado15.tli) 1    inline VARIANT_BOOL Recordset15::GetadoEOF (

java servlet调用带有多个返回结果集的存储过程

一.mysql存储过程 这里我先说下我这个功能实现的逻辑及途中遇到的一些问题.这个存储过程一共带两个输入参数,一共关联到两张表的查询,每个参数都对应查询表中的一个判断,所以一共返回了两个结果集(当然要返回更多结果集也是一样的,如果需要判断,就继续增加存储过程参数,如果不需要判断就直接在存储过程中,增加查询的SQL语句即可).实现这个功能还有更简单的方法,可以写SQL关联语句查询出两张表的结果,返回一个组合的结果集.我这里当然是为了实现这个效果,所以把它的实现复杂化了.继续说下我今天在mysql上

Java 返回结果集的存储过程

--返回结果集的存储过程 --1.创建一个包 create package myTestPackage as type test_cursor is ref cursor; end myTestPackage; --2.创建存储过程 create procedure sp_pro9( spNo in number, p_cursor out myTestPackage.test_cursor) is begin open p_cursor for select * from student wh

(转)jdbc 调用 sql server 的存储过程时“该语句没有返回结果集”的解决方法

本文转载自:http://hedyn.iteye.com/blog/856040 在JDBC中调用SQL Server中的存储过程时出现如下异常: com.microsoft.sqlserver.jdbc.SQLServerException: 该语句没有返回结果集. at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:171) at com.microsof

oracle 存储过程返回结果集

好久没上来了, 难道今天工作时间稍有空闲, 研究了一下oracle存储过程返回结果集. 配合oracle临时表, 使用存储过程来返回结果集的数据读取方式可以解决海量数据表与其他表的连接问题. 在存储过程中先根据过滤条件从海量数据表中选出符合条件的记录并存放到临时中, 可以通过一个视图将临时表与其他相关表连接起来, 从而避免海量数据造成的连接效率问题. 本文只讨论使用存储过程返回结果集. 具体实现如下: -- 启用服务器输出---------------------set serveroutput