`
zhaizhisheng
  • 浏览: 71625 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

Oracle 存储过程返回数据集(游标)

阅读更多

声明:本文整理自网络,加上个人实际实验结果

 

Oracle存储过程返回数据集,其实就是返回游标,这里需要了解这样几个概念,游标、存储过程的out参数、引用游标类型、Oracle的程序包,这里只说明具体怎么做,如果想了解以上概念请自行在网上搜索或关注我的博客。

首先说一下思路:

        定义一个包(这相当于一个容器)(也可以理解为Java中的类)

        包中包含一个存储过程来返回一个游标引用

        包中包含一个自定义类型 游标引用(这个类型也可以应用到其它地方,这在调用存储过程时用到)

 定义包分两部分:包头、包体

包头部分定义包中应该包含哪些内容(方法,存储过程等只做声明不做实现)(相当于Java中的接口)

 包头部分定义:

create or replace package pkg_alen
as
type cursorRef is ref cursor; --定义游标引用类型
procedure query(u_id number,cursor_ref out cursorRef); --定义存储过程声明
end pkg_alen;

 包体部分定义包头中的方法,存储过程等的实现(相当于Java中实现接口的类),注意必须实现包头中声明的所有方法和存储过程。

包体部分定义:

create or replace package body pkg_alen --注意这里的包名要和定义包头的包名一致
as
procedure query(u_id number,cursor_ref out cursorRef) --这里的存储过程要和包头中的一致参数列表中的参数名也要一致
is
begin
if u_id=0 then --如果传入的id为0则查询所有数据
open cursor_ref for select id,ck_name from dm_pac_ck;
else   --如果传入的id为非0则查询指定id的数据
open cursor_ref for select id,ck_name from dm_pac_ck where id=u_id; --根据查询打开游标
end if;
end query;
end pkg_alen;

 Ok,到些返回数据集的存储过程已经编写完成,这里需要注意的是:1、包头定义部分要先执行然后执行包体部分;2、cursorRef 类型为自定义类型 其原型为 ref coursor。

网上的资料很多都到此为止,但是有好多新手(也包括我在内)并不知道怎么调用,下面我就来和大家说一下怎么在SQL中调用(亲测可用)和怎么使用Java调用(未亲测)

  使用SQL调用上面定义的存储过程,这里需要注意了,调用存储过程的参数和参数类型(这个困扰了我好长时间),第一个参数没什么可说的就一数字型,主要是第二个参数,这个参数的类型是pkg_alen.cursorRef,没错就是这个自定义的类型(之前我尝试了 ref cursor 和定义一个新的ref cursor类型但是都报错)

调用部分内容:

set serveroutput on;
declare
return_cursor pkg_alen.cursorRef; --定义接收返回数据集的变量
v_id number(4);   --定义接收id的变量
uname varchar2(50);  --定义接收name的变量
begin 
pkg_alen.query(0,return_cursor);  --调用包中的存储过程返回游标引用
loop fetch return_cursor into v_id,uname; --循环获取游标中每一行的数据
exit when return_cursor%notfound;          --游标结束时退出
dbms_output.put_line('id:'||v_id||' name:'||uname); --将获取到的值打印出来
end loop;    --循环结束
close return_cursor;  --关闭游标
end;

 这里注意游标我们并没有打开只有关闭,因为游标的打开是在存储过程中完成的。

   使用Java调用上面定义的存储过程:

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;

import oracle.jdbc.OracleTypes;

publicclass Dao {
    
    String driver="oracle.jdbc.driver.OracleDriver";
    String url="jdbc:oracle:thin:@127.0.0.1:1521:orcl";
    Connection conn=null;
    CallableStatement cs=null;
    ResultSet rs;
    /**
     *获取数据连接的方法
     *应该首先调用些方法来获得数据库连接
     */
    publicvoid getConn(){
        try {
            Class.forName(driver);
            conn = DriverManager.getConnection(url, "scott", "tiger");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
   /**
    *调用存储过程返回数据集
    */
    publicvoid callProcForResult(){
        try {
            cs = conn.prepareCall("{call pkg_alen.query(?)}");
            cs.registerOutParameter(1, OracleTypes.CURSOR);
            cs.execute();
            ResultSet rs = (ResultSet)cs.getObject(1);
            while(rs!=null&& rs.next()){
                System.out.println(new StringBuilder("ID:").append(rs.getInt(1)).append("\t Name:").append(rs.getString(2)).toString());
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    publicvoid closeConn(){
        try {
            if (cs!=null) cs.close();
            if(conn!=null) conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    publicstaticvoid main(String[] args) {
        Dao dao =new Dao();
        dao.getConn(); //得到连接
       dao.callProcForResult(); //调用返回结果集的存储过程
        dao.closeConn(); //关闭连接
    }
}

 未亲测上面的Java代码,代码来源:http://www.cnblogs.com/icerainsoft/archive/2011/08/24/2152381.html

分享到:
评论

相关推荐

    oracle存储过程返回游标数据集

    存储过程中通过返回数据集,通过游标方式实现,以及在java中如何接收的整个过程

    groovy将JDBC中oracle存储过程游标转换为多层json

    入参是字符串格式的xml,目的是解析xml节点值,作为数据库检索where条件,检索出数据库记录,利用四个游标返回四个数据集,然后用groovy脚本将四个游标数据集解析成json出参中对应的四个节点值。出参json有两层结构...

    oracle存储过程写法

    存储过程中实现了游标的用法,并且返回一个数据集的方式。

    ORACLE技巧 - 不同记录集的横向合并

    实现的方式有多种,如编程存储过程返回游标,在存储过程中对两批数据进行比较...等等,当然返回差异数据的方式多种多样,既可以是游标,又可以临时表或其它方式。 本文主要论述利用ORACLE的MINUS函数和OVER函数,...

    Oracle 从入门到精通视频教程(11G版本)(ppt)

    Oracle 11g中支持的数据类型 数据库定义语言(DDL) 约束的使用 数据操纵语言(DML) 第5章-利用SELECT检索数据 SQL-数据库沟通的语言标准 Oracle 11g中支持的数据类型 数据库定义语言(DDL) 约束的使用 ...

    oracle 入门很简单.zip

    目录 第1章数据库简介ppt ...第17章函数与存储过程ppt 第18章数据车性能优化.ppt 第l9章数据库一致性与事务管理。ppt 第20章并发控制.ppt 第2l章Oracle在开发中的应用ppt 第22章Oracle+Hibernate应用实例.ppt

    sql总结.doc

    如果更改范围大到需要对输入存储过程的参数进行更改,或者要更改由其返回的数据,则您仍需要更新程序集中的代码以添加参数、更新 GetValue() 调用,等等,这时候估计比较繁琐了。 2.可移植性差 由于存储过程将应用...

    Oracle11g从入门到精通2

    《Oracle11g从入门到精通》面向数据库管理人员和数据库开发人员,从实际角度出发,系统地介绍了数据库和Oracle的相关概念和原理、Oracle的...完整案例来介绍基于Java开发包和Oracle数据库进行案例开发的详细过程...

    Oracle11g从入门到精通

    《Oracle11g从入门到精通》面向数据库管理人员和数据库开发人员,从实际角度出发,系统地介绍了数据库和Oracle的相关概念和原理、Oracle的...完整案例来介绍基于Java开发包和Oracle数据库进行案例开发的详细过程...

    ORACLE11G宝典.rar 是光盘里面的内容,书太厚咧没法影印啊

    程序设计,第5~9章分别介绍了Oracle11g的体系结构、表空间与数据文件的管理、启动和关闭数据库、网络服务与管理,第10—13章介绍了有关安全的几个内容(权限、角色、概要文件、用户的管理),第14—17章介绍了几种...

    Oracle.11g.从入门到精通 (2/2)

    7.3.4 存储过程检查 7.3.5 使用触发器 7.4 避免更改引起的大量改动 7.4.1 使用视图 7.4.2 使用同义名 7.4.3 使用光标 第8章 数据库用户管理 8.1 授予权限 8.1.1 直接授权 8.1.2 授权角色 8.1.3 使用OEM的“安全管理...

    Oracle.11g.从入门到精通 (1/2)

    7.3.4 存储过程检查 7.3.5 使用触发器 7.4 避免更改引起的大量改动 7.4.1 使用视图 7.4.2 使用同义名 7.4.3 使用光标 第8章 数据库用户管理 8.1 授予权限 8.1.1 直接授权 8.1.2 授权角色 8.1.3 使用OEM的“安全管理...

    Oracle 10g 学习笔记

    这个笔记是学习oracle数据库过程中整理出来的,比较详细,适合于初学者。 │ oracle与tomcat端口冲突.txt │ Oracle学习笔记.pdf │ Oracle学习笔记.wps │ 安装Oracle后myEclipse不能正常使用.txt │ 手工配置...

    Oracle Database 11g初学者指南--详细书签版

    他的关注方向包括Oracle产品集,以及其他前沿技术和这些技术在优化数据仓库设计和部署的应用。他还是各种技术会议的主讲人,包括COLLABORATE、Oracle OpenWorld和其他地方与区域会议。  Michael Abbey是公认的...

    oracle数据库经典题目

    该部分通过变量赋值、流程控制、数据查询、数据操纵、数据定义、事务控制、游标处理等实现块的功能。 异常处理部分:以关键字EXCEPTION开始,END结束。该部分用于处理该块执行过程中产生的异常。 8. 说明触发器的...

    oracle数据库11G初学者指南.Oracle.Database.11g,.A.Beginner's.Guide

    5.7 如何创建存储过程以及创建存储过程的原因 5.8 函数的创建和使用 5.9 调用PL/SQL程序 5.10 本章 测验 第6章 数据库管理员 6.1 了解DBA的工作 6.2 执行日常操作 6.2.1 体系结构和设计 6.2.2 容量规划 6.2.3 备份...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    其三、职业方向多:Oracle数据库管理方向、Oracle开发及系统架构方向、Oracle数据建模数据仓库等方向。 四、 如何学习 认真听课、多思考问题、多动手操作、有问题一定要问、多参与讨论、多帮组同学 五、 体系结构 ...

    Oracle 中 table 函数的应用浅析

    利用游标 REF CURSOR 可将数据集(多行记录)传递到PL/SQL函数: SELECT * FROM TABLE (myfunction (CURSOR (SELECT * FROM mytab))); 2. 利用两个实体化视图(或表)作为样板数据 CREATE MATERIALIZED VIEW ...

    Oracle 10g 开发与管理

    (2)替换符 (用来临时存储有关的数据) 46 5.帮助命令 46 (1)help index 将显示SQL*Plus的所有命令 47 (2)help 命令名称 显示该命令的功能和选项 47 6.其他的SQL*Plus命令 47 (1)退出 SQL> Exit | Quit; 47 ...

    PL/SQL Developer8.04官网程序_keygen_汉化

    即当一个对数据库的查询操作返回一组结果集时,用游标来标注这组结果集,以后通过对游标的操作来获取结果集中的数据信息。这里特别提出游标的概念,是因为它在PL/SQL的编程中非常的重要。  定义游标的语法结构如下...

Global site tag (gtag.js) - Google Analytics