`

java下实现调用oracle的存储过程和函数

阅读更多
在oracle下创建一个test的账户,然后

1.创建表:STOCK_PRICES
[cpp] view plaincopy
--创建表格 
CREATE TABLE STOCK_PRICES( 
    RIC VARCHAR(6) PRIMARY KEY, 
    PRICE NUMBER(7,2), 
    UPDATED DATE ); 
2.插入测试数据:
[sql] view plaincopy
--插入数据 
INSERT INTO stock_prices values('1111',1.0,SYSDATE); 
INSERT INTO stock_prices values('1112',2.0,SYSDATE); 
INSERT INTO stock_prices values('1113',3.0,SYSDATE); 
INSERT INTO stock_prices values('1114',4.0,SYSDATE); 
3.建立一个返回游标:
PKG_PUB_UTILS

[cpp] view plaincopy
--建立一个返回游标 
CREATE OR REPLACE PACKAGE PKG_PUB_UTILS IS 
    --动态游标 
    TYPE REFCURSOR IS REF CURSOR; 
END PKG_PUB_UTILS; 
4.创建和存储过程:P_GET_PRICE
[sql] view plaincopy
--创建存储过程 
CREATE OR REPLACE PROCEDURE P_GET_PRICE 

  AN_O_RET_CODE OUT NUMBER, 
  AC_O_RET_MSG  OUT VARCHAR2, 
  CUR_RET OUT PKG_PUB_UTILS.REFCURSOR, 
  AN_I_PRICE IN NUMBER 
)  
IS 
BEGIN 
    AN_O_RET_CODE := 0; 
    AC_O_RET_MSG  := '操作成功'; 
     
    OPEN CUR_RET FOR 
        SELECT * FROM STOCK_PRICES WHERE PRICE<AN_I_PRICE; 
EXCEPTION 
    WHEN OTHERS THEN 
        AN_O_RET_CODE := -1; 
        AC_O_RET_MSG  := '错误代码:' || SQLCODE || CHR(13) || '错误信息:' || SQLERRM; 
END P_GET_PRICE; 
5.创建函数:
[cpp] view plaincopy
--创建函数:F_GET_PRICE 
CREATE OR REPLACE FUNCTION F_GET_PRICE(v_price IN NUMBER) 
    RETURN PKG_PUB_UTILS.REFCURSOR 
AS 
    stock_cursor PKG_PUB_UTILS.REFCURSOR; 
BEGIN 
    OPEN stock_cursor FOR 
    SELECT * FROM stock_prices WHERE price < v_price; 
    RETURN stock_cursor; 
END; 
6.JAVA调用存储过程返回结果集
JDBCoracle10G_INVOKEPROCEDURE.java

[java] view plaincopy
import java.sql.*; 
import oracle.jdbc.OracleCallableStatement; 
import oracle.jdbc.OracleTypes; 
 
/* 本例是通过调用oracle的存储过程来返回结果集:
* oracle 9i、10G 的jdbc由1个jar包组成:classes12.zip
*/ 
public class JDBCoracle10G_INVOKEPROCEDURE { 
    Connection conn = null; 
    Statement statement = null; 
    ResultSet rs = null; 
    CallableStatement stmt = null; 
 
    String driver; 
    String url; 
    String user; 
    String pwd; 
    String sql; 
    String in_price; 
 
    public JDBCoracle10G_INVOKEPROCEDURE()  
    { 
        driver = "oracle.jdbc.driver.OracleDriver"; 
        url = "jdbc:oracle:thin:@localhost:1521:ORCL"; 
        // oracle 用户 
        user = "test"; 
        // oracle 密码 
        pwd = "test"; 
        init(); 
        // mysid:必须为要连接机器的sid名称,否则会包以下错: 
        // java.sql.SQLException: Io 异常: Connection 
        // refused(DESCRIPTION=(TMP=)(VSNNUM=169870080)(ERR=12505)(ERROR_STACK=(ERROR=(CODE=12505)(EMFI=4)))) 
        // 参考连接方式: 
        // Class.forName( "oracle.jdbc.driver.OracleDriver" ); 
        // cn = DriverManager.getConnection( 
        // "jdbc:oracle:thin:@MyDbComputerNameOrIP:1521:ORCL", sUsr, sPwd ); 
 
    } 
 
    public void init() { 
        System.out.println("oracle jdbc test"); 
        try { 
            Class.forName(driver); 
            System.out.println("driver is ok"); 
            conn = DriverManager.getConnection(url, user, pwd); 
            System.out.println("conection is ok"); 
            statement = conn.createStatement(); 
            // conn.setAutoCommit(false); 
            // 输入参数 
            in_price = "3.0"; 
            // 调用函数 
            stmt = conn.prepareCall("call P_GET_PRICE(?,?,?,?)"); 
            stmt.registerOutParameter(1, java.sql.Types.FLOAT); 
            stmt.registerOutParameter(2, java.sql.Types.CHAR); 
            stmt.registerOutParameter(3, oracle.jdbc.OracleTypes.CURSOR); 
            stmt.setString(4, in_price); 
            stmt.executeUpdate(); 
            int retCode = stmt.getInt(1); 
            String retMsg = stmt.getString(2); 
            if (retCode == -1) { // 如果出错时,返回错误信息 
                System.out.println("报错!"); 
            } else { 
                // 取的结果集的方式一: 
                rs = ((OracleCallableStatement) stmt).getCursor(3); 
                // 取的结果集的方式二: 
                // rs = (ResultSet) stmt.getObject(3); 
                String ric; 
                String price; 
                String updated; 
                // 对结果进行输出 
                while (rs.next()) { 
                    ric = rs.getString(1); 
                    price = rs.getString(2); 
                    updated = rs.getString(3); 
                    System.out.println("ric:" + ric + ";-- price:" + price 
                            + "; --" + updated + "; "); 
                } 
            } 
 
        } catch (Exception e) { 
            e.printStackTrace(); 
        } finally { 
            System.out.println("close "); 
        } 
    } 
 
    public static void main(String args[])// 自己替换[] 
    { 
        new JDBCoracle10G_INVOKEPROCEDURE(); 
    } 

7.开发JAVA调用函数返回结果集
JDBCoracle10G_INVOKEFUNCTION.java

[java] view plaincopy
import java.sql.*; 
import oracle.jdbc.OracleCallableStatement; 
import oracle.jdbc.OracleTypes; 
 
/*
/* 本例是通过调用oracle的函数来返回结果集:
* oracle 9i、10G 的jdbc由1个jar包组成:classes12.zip  
*/ 
public class JDBCoracle10G_INVOKEFUNCTION { 
    Connection conn = null; 
    Statement statement = null; 
    ResultSet rs = null; 
    CallableStatement stmt = null; 
 
    String driver; 
    String url; 
    String user; 
    String pwd; 
    String sql; 
    String in_price; 
 
    public JDBCoracle10G_INVOKEFUNCTION() 
    { 
        driver = "oracle.jdbc.driver.OracleDriver"; 
        url = "jdbc:oracle:thin:@localhost:1521:ORCL"; 
        // oracle 用户 
        user = "test"; 
        // oracle 密码 
        pwd = "test"; 
        init(); 
        // mysid:必须为要连接机器的sid名称,否则会包以下错: 
        // java.sql.SQLException: Io 异常: Connection 
        // refused(DESCRIPTION=(TMP=)(VSNNUM=169870080)(ERR=12505)(ERROR_STACK=(ERROR=(CODE=12505)(EMFI=4)))) 
        // 参考连接方式: 
        // Class.forName( "oracle.jdbc.driver.OracleDriver" ); 
        // cn = DriverManager.getConnection( 
        // "jdbc:oracle:thin:@MyDbComputerNameOrIP:1521:ORCL", sUsr, sPwd ); 
    } 
 
    public void init() { 
        System.out.println("oracle jdbc test"); 
        try { 
            Class.forName(driver); 
            System.out.println("driver is ok"); 
            conn = DriverManager.getConnection(url, user, pwd); 
            System.out.println("conection is ok"); 
            statement = conn.createStatement(); 
            // conn.setAutoCommit(false); 
            // 输入参数 
            in_price = "5.0"; 
            // 调用函数 
            stmt = conn.prepareCall("{? = call F_GET_PRICE(?)}"); 
            // stmt.registerOutParameter(1, java.sql.Types.FLOAT); 
            // stmt.registerOutParameter(2, java.sql.Types.CHAR); 
            stmt.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR); 
            stmt.setString(2, in_price); 
            stmt.executeUpdate(); 
            // 取的结果集的方式一: 
            rs = ((OracleCallableStatement) stmt).getCursor(1); 
            // 取的结果集的方式二: 
            // rs = (ResultSet) stmt.getObject(1); 
            String ric; 
            String price; 
            String updated; 
 
            while (rs.next()) { 
                ric = rs.getString(1); 
                price = rs.getString(2); 
                updated = rs.getString(3); 
                System.out.println("ric:" + ric + ";-- price:" + price + "; --" 
                        + updated + "; "); 
            } 
 
        } catch (Exception e) { 
            e.printStackTrace(); 
        } finally { 
            System.out.println("close "); 
        } 
    } 
 
    public static void main(String args[])// 自己替换[] 
    { 
        new JDBCoracle10G_INVOKEFUNCTION(); 
    } 

   http://blog.csdn.net/xw13106209/article/details/6905259
分享到:
评论

相关推荐

    java调用oracle存储过程或者函数

    java调用oracle存储过程或者函数

    java中调用oracle的存储过程和函数

    你还在为如何调用oracle中的存储过程和函数而烦恼吗,请看看该文档。

    Java调用Oracle的过程和函数

    调用数据库里的一个函数 一个函数本质上一个返回一个结果的存储过程,这个例子示范了怎么调用有in、out和in/out参数的函数

    Java调用oracle函数返回oracle类(类似)集合

    Java调用oracle函数返回oracle类(类似)集合

    Mybatis传list参数调用oracle存储过程的解决方法

    怎么利用MyBatis传List类型参数到数据库存储过程中实现批量插入数据?接下来通过本文给大家介绍Mybatis传list参数调用oracle存储过程,需要的朋友可以参考下

    Oracle教程,java调用oracle

    基本查询 过滤和排序 单行函数 组函数 多表查询 子查询 集合运算 创建和管理表 光标 例外 Java调用存储过程和存储函数 触发器

    Oracle经典自定义创建函数和存储过程

    自定义函数不能被直接在Java中调用,可以通过存储过程调用函数的方法。本文采用实例的方法,介绍如何在Oracle数据库客户端PL/SQL中创建自定义函数,然后创建相应的存储过程调用该函数,最终实现一个实例计算。

    一种利用Oracle-java包存储图片的解决方案

    01. 安装Oracle图文存储函数及JavaSource 02. 建立2014年的图文硬盘目录 03. 建立2014年的图文Oracle目录 04. 对Oracle用户XXXX进行目录访问授权2014年 05. 通过图文读写测试程序验证配置正确性(暂无需要可联系)...

    如何从 Java 存储过程将 JDBC ResultSet 作为 Ref Cursor 返回.doc

    Java 存储过程的调用规范将 ResultSet 映射到 REF CURSOR。在 Oracle9i 之前,不可能从 Java 存储过程直接返回一个 ResultSet,因为没有定义表单 ResultSet-&gt;REF CURSOR 的映射。Oracle9i 增加了此映射,允许从函数...

    6年javaEE开发的Word资料合集

    详细解释的 Java面试题 最小函数依赖 在数据库中实现base64编码和解码 java servlet总结 java的时间操作 画Web流程图的一点心得 深入Java核心 Java内存分配原理精讲 JAVA调用存储过程详解 经典SQL语句大全 使用...

    oracle 学习 笔记 实用

    oracle 日常学习的记录…… java调用oracle的存储过程 oracle number(1)一般对应于Java中的类型 Oracle常用函数 oracle触发器new Oracle中自增字段的两种方法 字典表查询

    Oracle中命名块之存储过程的详解及使用方法

     包:可容纳多个过程或函数的一个容器(较好管理这些过程和函数,类似于java中的包);  触发器:在合适的实际被自动执行。(无需调用,在满足要求的情况下,自动执行;触发器也被称为隐式执行的命名块!)

    21天学通Oracle

    8.3.3 调用程序包中的函数/存储过程 157 8.3.4 程序包中的变量 158 8.4 本章实例 159 8.5 本章小结 161 8.6 习题 161 …… 第9章 游标(教学视频:36分钟) 162 第10章 触发器(教学视频:58分钟) 178 第11...

    Oracle11g从入门到精通2

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

    oracle进阶之PLSQL编程.rar_oracle_oracle 编程_应用于java程序

    通过学习PL/SQL基础语法和函数、存储过程、包、触发器等数据库对象的概念、基本语法及应用,达到学以致用的目的,并能在应用程序中调用存储函数及过程

    java开源包1

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

Global site tag (gtag.js) - Google Analytics