`
maosheng
  • 浏览: 553694 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

 
阅读更多

创建测试用表:
CREATE TABLE USER
(
   I_ID   VARCHAR(50) NOT NULL,
   I_NAME VARCHAR(50) NOT NULL
);

一:无返回值的存储过程
1,建立存储过程:
CREATE OR REPLACE
PROCEDURE TESTA(
    PARA1 IN VARCHAR2,
    PARA2 IN VARCHAR2)
AS
BEGIN
  INSERT INTO USER
    (I_ID,I_NAME
    ) VALUES
    (PARA1, PARA2
    );
END TESTA;

 

2,Java程序:

package com.hyq.src;

public class TestProcedureOne {

  public TestProcedureOne() {

  }

  public static void main(String[] args ){

    String driver = "oracle.jdbc.driver.OracleDriver";

    String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521: hyq ";

    Statement stmt = null;

    ResultSet rs = null;

    Connection conn = null;

    CallableStatement cstmt = null;

    try {

      Class.forName(driver);

      conn =  DriverManager.getConnection(strUrl, " hyq ", " hyq ");

      CallableStatement proc = null;

      proc = conn.prepareCall("{ call HYQ.TESTA(?,?) }");

     // proc = conn.prepareCall("begin HYQ.TESTA(?,?); end;");

      proc.setString(1, "100");

      proc.setString(2, "TestOne");

      proc.execute();

    }catch (SQLException ex2) {

      ex2.printStackTrace();

    }catch (Exception ex2) {

      ex2.printStackTrace();

    }finally{

      try {

        if(rs != null){

          rs.close();

          if(stmt!=null){

            stmt.close();

          }

          if(conn!=null){

            conn.close();

          }

        }

      }catch (SQLException ex1)
      {

      }

    }

  }
}

二:有返回值的存储过程(非列表)

1,建立存储过程:
CREATE OR REPLACE
PROCEDURE TESTB(
    PARA1 IN VARCHAR2,
    PARA2 OUT VARCHAR2)
AS
BEGIN
  SELECT I_NAME INTO PARA2 FROM TESTTB WHERE I_ID= PARA1;
END TESTB;

 

2,Java程序:
package com.hyq.src;

public class TestProcedureTWO {

  public TestProcedureTWO() {

  }

  public static void main(String[] args ){

    String driver = "oracle.jdbc.driver.OracleDriver";

    String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521:hyq";

    Statement stmt = null;

    ResultSet rs = null;

    Connection conn = null;

    try {

      Class.forName(driver);

      conn =  DriverManager.getConnection(strUrl, " hyq ", " hyq ");

      CallableStatement proc = null;

  // proc = conn.prepareCall("{ call HYQ.TESTB(?,?) }");

      proc = conn.prepareCall("begin HYQ.TESTB(?,?); end;");

      proc.setString(1, "100");

      proc.registerOutParameter(2, oracle.jdbc.OracleTypes.VARCHAR);

      proc.execute();

      String testPrint = proc.getString(2);

      System.out.println("=testPrint=is="+testPrint);

    }catch (SQLException ex2) {

      ex2.printStackTrace();

    }catch (Exception ex2) {

      ex2.printStackTrace();

    }finally{

      try {

        if(rs != null){

          rs.close();

          if(stmt!=null){

            stmt.close();

          }

          if(conn!=null){

            conn.close();

          }

        }

      }catch (SQLException ex1) {

      }

    }

  }

}

}


三:返回列表
由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage了.它是把游标(可以理解为一个指针),作为一个out 参数来返回值的.所以要分两部分:

1,建一个程序包:
CREATE OR REPLACE
PACKAGE TESTPACKAGE
AS
TYPE Test_CURSOR
IS
  REF
  CURSOR;
  END TESTPACKAGE;

2,建立存储过程:
CREATE OR REPLACE
PROCEDURE TESTC(
    PARA1 IN VARCHAR2,p_CURSOR OUT TESTPACKAGE.Test_CURSOR)
IS
BEGIN
  OPEN p_CURSOR FOR SELECT * FROM HYQ.TESTTB WHERE I_ID= PARA1;
END TESTC;


3,Java程序:
package com.hyq.src;

public class TestProcedureTHREE {

  public TestProcedureTHREE() {

  }

  public static void main(String[] args ){

    String driver = "oracle.jdbc.driver.OracleDriver";

    String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521:hyq";

    Statement stmt = null;

    ResultSet rs = null;

    Connection conn = null;

    try {

      Class.forName(driver);

      conn =  DriverManager.getConnection(strUrl, "hyq", "hyq");

      CallableStatement proc = null;

      proc = conn.prepareCall("{ call hyq.testc(?,?) }");

 //   proc = conn.prepareCall("begin hyq.testc(?,?); end;");

      proc.setString(1, "100")

      proc.registerOutParameter(2,oracle.jdbc.OracleTypes.CURSOR);

      proc.execute();

      rs = (ResultSet)proc.getObject(2);

      while(rs.next())

      {

          System.out.println("<tr><td>" + rs.getString(1) + "</td><td>"+rs.getString(2)+"</td></tr>");

      }

    }catch (SQLException ex2) {

      ex2.printStackTrace();

    }catch (Exception ex2) {

      ex2.printStackTrace();

    }finally{

      try {

        if(rs != null){

          rs.close();

          if(stmt!=null){

            stmt.close();

          }

          if(conn!=null){

            conn.close();

          }

        }

      }catch (SQLException ex1) {

      }

    }

  }

}

 

四:调用函数返回列表

1,建一个程序包:

CREATE OR REPLACE
PACKAGE TESTPACKAGE
AS
TYPE Test_CURSOR
IS
  REF
  CURSOR;
END TESTPACKAGE;

2,建立函数:
CREATE OR REPLACE
FUNCTION TESTD(
    PARA1 IN VARCHAR2)
RETURN TESTPACKAGE.Test_CURSOR
IS
rc TESTPACKAGE.Test_CURSOR;
BEGIN
  OPEN rc FOR SELECT * FROM HYQ.TESTTB WHERE I_ID= PARA1;
  return rc;
END TESTD;

 

3,Java程序:
package com.hyq.src;

public class TestProcedureTHREE {

  public TestProcedureTHREE() {

  }

  public static void main(String[] args ){

    String driver = "oracle.jdbc.driver.OracleDriver";

    String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521:hyq";

    Statement stmt = null;

    ResultSet rs = null;

    Connection conn = null;

    try {

      Class.forName(driver);

      conn =  DriverManager.getConnection(strUrl, "hyq", "hyq");

      CallableStatement proc = null;

      proc = conn.prepareCall("{ call ? :=HYQ.TESTD(?) }");

 //   proc = conn.prepareCall("begin ? :=HYQ.TESTD(?); end;");
 
   proc.registerOutParameter(1,oracle.jdbc.OracleTypes.CURSOR);

      proc.setString(2, "100")

      proc.execute();

      rs = (ResultSet)proc.getObject(1);

      while(rs.next())

      {

          System.out.println("<tr><td>" + rs.getString(1) + "</td><td>"+rs.getString(2)+"</td></tr>");

      }

    }catch (SQLException ex2) {

      ex2.printStackTrace();

    }catch (Exception ex2) {

      ex2.printStackTrace();

    }finally{

      try {

        if(rs != null){

          rs.close();

          if(stmt!=null){

            stmt.close();

          }

          if(conn!=null){

            conn.close();

          }

        }

      }catch (SQLException ex1) {

      }

    }

  }

}

分享到:
评论

相关推荐

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

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

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

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

    Java调用Oracle的过程和函数

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

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

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

    Oracle教程,java调用oracle

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

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

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

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

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

    个人亲测oracle触发器调用java程序

    在本文中,我们将介绍如何使用Oracle触发器调用Java程序。 一、加载Java程序 首先,我们需要将Java程序加载到Oracle数据库中。我们可以使用LOADJAVA命令来实现这一步骤。LOADJAVA命令位于$ORACLE_HOME/bin目录下,...

    一种利用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 增加了此映射,允许从函数...

    oracle调用webService

    在系统实现中,有时会有直接在数据库端利用触发器、存储过程等方式进行数据传递、分发的业务,而其中可能会涉及一些业务逻辑,为了处理这些业务逻辑,并简单起见,可以直接在触发器或存储过程中调用一些 Java 类或 ...

    oracle 学习 笔记 实用

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

    6年javaEE开发的Word资料合集

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

    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数据库进行案例开发的详细过程...

Global site tag (gtag.js) - Google Analytics