java与oracle存储过程

原创 2007年09月19日 22:47:00
 

用java调用oracle存储过程总结

转自:http://www.blogjava.net/TrampEagle/archive/2005/12/13/23605.aspx

一:无返回值的存储过程

存储过程为:

CREATE OR REPLACE PROCEDURE TESTA(PARA1 IN VARCHAR2,PARA2 IN VARCHAR2)  AS

BEGIN

   INSERT INTO HYQ.B_ID (I_ID,I_NAME) VALUES (PARA1, PARA2);

END TESTA;

然后呢,在java里调用时就用下面的代码:

package com.hyq.src;

 

import java.sql.*;

import java.sql.ResultSet;

 

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.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) {

      }

    }

  }

}

当然了,这就先要求要建张表TESTTB,里面两个字段(I_IDI_NAME)。

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

存储过程为:

CREATE OR REPLACE PROCEDURE TESTB(PARA1 IN VARCHAR2,PARA2 OUT VARCHAR2)  AS

BEGIN

   SELECT INTO PARA2 FROM TESTTB WHERE I_ID= PARA1;

END TESTB;

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.setString(1, "100");

      proc.registerOutParameter(2, Types.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) {

      }

    }

  }

}

 

}

注意,这里的proc.getString(2)中的数值2并非任意的,而是和存储过程中的out列对应的,如果out是在第一个位置,那就是proc.getString(1),如果是第三个位置,就是proc.getString(3),当然也可以同时有多个返回值,那就是再多加几个out参数了。

三:返回列表

由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage.所以要分两部分,

1,  建一个程序包。如下:

CREATE OR REPLACE PACKAGE TESTPACKAGE  AS

 TYPE Test_CURSOR IS REF CURSOR;

end TESTPACKAGE;

2,建立存储过程,存储过程为:

CREATE OR REPLACE PROCEDURE TESTC(p_CURSOR out TESTPACKAGE.Test_CURSOR) IS

BEGIN

    OPEN p_CURSOR FOR SELECT * FROM HYQ.TESTTB;

END TESTC;

可以看到,它是把游标(可以理解为一个指针),作为一个out 参数来返回值的。

java里调用时就用下面的代码:

package com.hyq.src;

import java.sql.*;

import java.io.OutputStream;

import java.io.Writer;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import oracle.jdbc.driver.*;

 

 

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.registerOutParameter(1,oracle.jdbc.OracleTypes.CURSOR);

      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) {

      }

    }

  }

}

在这里要注意,在执行前一定要先把oracle的驱动包放到class路径里,否则会报错的。

java调用oracle存储过程例子

1,导jar包---ojdbc6.jar 2,建立一个分页存储过程 create or replace procedure my_page(v_in_tableName in varchar2, ...
  • u013614451
  • u013614451
  • 2015年05月28日 23:42
  • 624

JAVA调用oracle三种存储过程实例

JAVA调用存储过程:几经挫折,但总算搞通了,为了避免后来者少走弯路,特记述与此,同时亦对自己进行鼓励。创建测试用表: CREATE TABLE T_TEST(I_ID NVARCHAR(20),I_...
  • ice_spar
  • ice_spar
  • 2007年10月20日 21:14
  • 3913

Java执行Oracle存储过程并接收返回值

Java执行Oracle存储过程并接收多个返回值(集合/数值)
  • xiaosheng_papa
  • xiaosheng_papa
  • 2016年03月01日 15:18
  • 869

JAVA调用Oracle存储过程传入结构化参数

 一、JAVA部分import java.math.BigDecimal;import java.util.Hashtable;import java.util.Vector;import com.s...
  • nnnnyyyy
  • nnnnyyyy
  • 2011年05月06日 10:12
  • 2824

JAVA与Oracle存储过程

在大型数据库系统中,有两个很重要作用的功能,那就是存储过程和触发器。在数据库系统中无论是存储过程还是触发器,都是通过SQL 语句和控制流程语句的集合来完成的。相对来说,数据库系统中的触发器也是一种存储...
  • duoluohua
  • duoluohua
  • 2012年10月08日 13:28
  • 378

JAVA与Oracle存储过程(二)

在前一篇文章中简单介绍了JAVA程序如何调用Oracle存储过程的基本语法程序结构, 本文将介绍JAVA跟Oracle的另一种关系,即通过JAVA编写Oracle存储过程。 通常情况下,我们都是使用O...
  • huazaichang
  • huazaichang
  • 2013年01月29日 13:48
  • 221

oracle存储过程及Java调用

一个oracle存储过程对象数组参数的例子,Java调用测试通过
  • u013863751
  • u013863751
  • 2015年05月28日 01:14
  • 1838

Oracle存储过程,函数,触发器

一:存储过程的定义     1>过程(多次编译 多次执行):        --过程实现计算器        declare p1 number:=1;        p2 number:=2...
  • t0404
  • t0404
  • 2016年07月01日 23:45
  • 455

如何在Oracle中使用Java存储过程(详解)

其实,这篇短文,我早就应该写了。因为,Java存储过程今后在各大数据库厂商中越来越流行,功能也越来越强大。这里以Oracle为例,介绍一下java存储过程的具体用法。一、如何创建java存储过程?通常...
  • xiaodoudou123456
  • xiaodoudou123456
  • 2016年06月16日 22:13
  • 344

Oracle数据库中使用java实现存储过程

使用命令行实现java存储过程首先使用非DBA账户登陆sqlplus,然后SQL> create or replace and compile java source named "javademo1...
  • u011179993
  • u011179993
  • 2016年11月30日 14:55
  • 697
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java与oracle存储过程
举报原因:
原因补充:

(最多只允许输入30个字)