oracle 定义返回结果集的存储过程
在程序开发中,常用到返回结果集的存储过程,这个在mysql和sql server 里比较好处理,直接返回查询结果就可以了,
但在oracle里面 要 out 出去,就多了一个步骤,对于不熟悉的兄弟们还得出上一头汗:),这里我简单介绍一下,以供参考,
1 定义包
oracle 返回的结果集需要自定义一个 CURSOR (游标变量)性质的变量,这个要在包头定义,所以要建立一个包,如下是包头
CREATE OR REPLACE PACKAGE PAK_rstest IS TYPE retcursor IS REF CURSOR; PROCEDURE pro_read ( outcurse IN OUT retcursor ); END; -- Package spec
上面是建立了一个名称为PAK_rstest的包头,里面定义了一个CURSOR 类型,类型名为retcursor ,有了这个定义我们就可以用他来返回结果集了,比如该包里面的 pro_read 过程就是 一个返回结果集的过程,下面是他的包体,
CREATE OR REPLACE PACKAGE BODY PAK_rstest IS PROCEDURE pro_read ( outcurse IN OUT retcursor ) IS begin OPEN outcurse FOR select * from tbl_test where rownum<6; return; end; END;
这样就定义好了一个包,这个包里面有个返回结果集的过程 pro_read
2 在程序里面调用,
下面就是如果在程序里面调用了,这里用java为例子简单介绍一下,
假设你现在已经有一个Connection conn 对象连接上了数据库(如何连接数据库我这里就不详细说了),
则用下面的代码调用过程,
if(conn !=null){ String sqlstr = "{call PAK_SMS2_ROUTE.MO_ISSUE(?)}"; CallableStatement cstmt = conn.prepareCall(sqlstr); cstmt.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR); //outcurse cstmt.executeUpdate(); ResultSet rs = (ResultSet) cstmt.getObject(1); // 这里吧信息已经读入rs结果集里面,剩下的大家都熟悉了吧 while (rs.next()) { System.out.println(rs.getString("s_date1")); //tbl_test 表里的字段名称或是结果集的列名称 System.out.println(rs.getString("s_date2")); } conn.close(); conn = null; }
好了到这里就可以看到返回的结果集内容了,是不是比较简单啊,:)
Oracle 存储过程返回结果集 *过程返回记录集: CREATE OR REPLACE PACKAGE pkg_test AS TYPE myrctype IS REF CURSOR; PROCEDURE get (p_id NUMBER, p_rc OUT myrctype); END pkg_test; / CREATE OR REPLACE PACKAGE BODY pkg_test AS PROCEDURE get (p_id NUMBER, p_rc OUT myrctype) IS sqlstr VARCHAR2 (500); BEGIN IF p_id = 0 THEN OPEN p_rc FOR SELECT ID, NAME, sex, address, postcode, birthday FROM student; ELSE sqlstr := 'select id,name,sex,address,postcode,birthday from student where id=:w_id'; OPEN p_rc FOR sqlstr USING p_id; END IF; END get; END pkg_test; / 函数返回记录集: 建立带ref cursor定义的包和包体及函数: CREATE OR REPLACE package pkg_test as /* 定义ref cursor类型 不加return类型,为弱类型,允许动态sql查询, 否则为强类型,无法使用动态sql查询; */ type myrctype is ref cursor; --函数申明 function get(intID number) return myrctype; end pkg_test; / CREATE OR REPLACE package body pkg_test as --函数体 function get(intID number) return myrctype is rc myrctype; --定义ref cursor变量 sqlstr varchar2(500); begin if intID=0 then --静态测试,直接用select语句直接返回结果 open rc for select id,name,sex,address,postcode,birthday from student; else --动态sql赋值,用:w_id来申明该变量从外部获得 sqlstr := 'select id,name,sex,address,postcode,birthday from student where id=:w_id'; --动态测试,用sqlstr字符串返回结果,用using关键词传递参数 open rc for sqlstr using intid; end if; return rc; end get; end pkg_test;
JAVA调用oracle函数返回游标处理
CallableStatement cstmt = null; ResultSet rs = null; try { String callSql = "{? = call AAAAA(?)}"; cstmt = conn.prepareCall(callSql); cstmt.setString(2, "userName"); cstmt.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR); cstmt.execute(); rs = (ResultSet) cstmt.getObject(1); if (rs != null) { System.out.print("usercd"); System.out.print("userName"); System.out.println("EMAIL"); while (rs.next()) { System.out.print(rs.getString(1)+" "); System.out.print(rs.getString(2)+" "); System.out.println(rs.getString(3)); } }
相关推荐
调用Oracle函数的过程与调用存储过程类似,但创建CallableStatement时的SQL语句略有不同。由于函数会返回一个值,所以格式通常是`{? = call function_name(?, ?, ...)}`。在执行后,通过`CallableStatement....
### Oracle存储过程返回结果集详解 #### 一、概述 在Oracle数据库中,存储过程是一种重要的编程组件,它能够执行一系列SQL语句并处理复杂的业务逻辑。存储过程的一个常见应用场景是返回结果集(Record Set),这有...
本文介绍了Java调用Oracle存储过程返回结果集Record和Cursor的相关知识点,包括创建Type、PACKAGE和PROCEDURE,Java代码中调用存储过程,并获取结果集。这些知识点对深入了解Oracle存储过程和Java调用Oracle存储过程...
Oracle数据库作为企业级的主流数据库系统,提供了丰富的存储过程和函数功能,以实现复杂的数据处理逻辑。而Hibernate作为一种流行的Java持久化框架,它允许开发者通过ORM(对象关系映射)方式与数据库进行交互。本篇...
此外,还需要实现一个函数`fun_plan_station_contrast`,该函数将负责处理存储过程返回的结果(通常为游标),并根据业务需求进行进一步的数据处理或逻辑判断。 ##### 存储过程:`plan_station_contrast` 首先定义...
### Java中调用Oracle的存储过程和函数 在Java应用程序中调用Oracle数据库中的存储过程或函数是一项常见的任务。这不仅能够提高代码的执行效率,还可以有效地管理事务处理,确保数据的一致性和完整性。本文将详细...
通过以上步骤,我们可以在Delphi中成功调用Oracle的存储过程,并获取其返回的结果集。这对于在Delphi应用程序中集成复杂的数据库逻辑非常有帮助。 总结来说,本文详细介绍了如何在Delphi中调用Oracle的存储过程,...
2. **调用存储过程**:使用`EXECUTE`关键字或直接在PL/SQL块中调用,如: ```sql DECLARE result VARCHAR2(100); BEGIN my_procedure(123, result); DBMS_OUTPUT.PUT_LINE(result); END; ``` **二、Oracle...
本文实例讲述了Python使用cx_Oracle调用Oracle存储过程的方法。分享给大家供大家参考,具体如下: 这里主要测试在Python中通过cx_Oracle调用PL/SQL。 首先,在数据库端创建简单的存储过程。 create or replace ...
综上所述,Oracle调用存储过程涉及到许多方面,从创建、调用到参数管理和异常处理,都需要对Oracle的PL/SQL语法和数据库管理有深入理解。通过熟练掌握这些知识点,开发者可以更有效地利用存储过程来提升应用程序的...
- **定义**:包是一组相关的存储过程、函数和类型定义的集合。 - **组成**:包由两部分组成——包规范和包体。 - 包规范:声明了包中包含的存储过程和函数的接口。 - 包体:包含了实际的实现代码。 - **创建**: ...
"使用OLE-DB和ADO调用返回记录集的Oracle存储过程" 摘要:本文介绍了如何使用OLE DB和ADO调用返回记录集的Oracle存储过程。OLE DB是一个开放规范,提供了对不同类型数据的访问和操纵标准。ADO是OLE DB的消费者,...
### Oracle存储过程、函数与DBLink详解 #### 一、Oracle存储过程简介 在Oracle数据库中,存储过程是一种预编译好的SQL代码集合,它可以接受输入参数、返回单个值或多个值,并能够执行复杂的数据库操作。存储过程...
在Oracle数据库中,函数和存储过程是两种非常重要的数据库对象,它们用于封装特定的业务逻辑,提高代码的重用性和数据库的效率。本教程将详细讲解如何在不同的环境中调用Oracle的函数和存储过程。 首先,Oracle的...
在完成调用存储过程后,我们还可以探讨如何使用Java创建Oracle存储过程。这个过程涉及到Oracle的PL/SQL和Java的集成: 1. 启动SQL*Plus,这是一个用于交互式SQL查询和管理Oracle数据库的工具。 2. 定义一个Java类,...
在Oracle数据库中,存储过程、游标和函数是非常重要的组成部分,它们为数据库管理提供了强大的编程能力。通过学习这些概念,我们可以更加灵活地管理和操作数据库数据。 ##### 1.1 存储过程 存储过程是一组预先编译...
C#中调用ORACLE的PACKAGE里方法和存储过程的应用 在实际开发中,C#与ORACLE数据库的集成是一个非常重要的 topic,本文将详细介绍如何在C#中调用ORACLE的PACKAGE里的方法和存储过程。 首先,我们需要在ORACLE数据库...
综合这三个主题,Oracle数据库开发者可以通过学习和熟练运用存储过程、函数和PL/SQL,提升数据库应用程序的性能和可维护性。了解并掌握游标管理,可以帮助开发者更加高效地处理大数据量的情况。这些知识对于任何涉及...
在这个"Oracle存储过程函数生成DEMO"中,我们主要关注如何在Oracle数据库环境中设计、编写、测试以及调用存储过程和函数。下面将详细阐述相关知识点。 1. **存储过程**: - 存储过程是一组预先编译的SQL语句,存储...