oracle分页存储过程 oracle存储过程实例

复制代码 代码如下:import
java.sql.CallableStatement;import java.sql.Connection;import
java.sql.DriverManager;import java.sql.ResultSet;import
java.sql.SQLException;import java.sql.Statement;public class TestPage
{public TestPage() {}public static void main(String[] args) {String
driver = “oracle.jdbc.driver.OracleDriver”;String strUrl =
“jdbc:oracle:thin:@localhost:1521:xmgl”;String username = “xmgl”;String
password = “xmgl”;Statement stmt = null;ResultSet rs = null;Connection
conn = null;try {Class.forName(driver);conn =
DriverManager.getConnection(strUrl, username,
password);System.out.println(“ok”);CallableStatement cs =
null;//创建CallableStatementcs = conn.prepareCall(“{call
page.fenye(?,?,?,?,?,?)}”);cs.setString(1, “mytest”);//表名cs.setInt(2,
3);//显示几条记录cs.setInt(3,
1);//第几页//注册总记录数,声明输出参数是什么类型的
cs.registerOutParameter(4,oracle.jdbc.OracleTypes.INTEGER);//注册总页数cs.registerOutParameter(5,oracle.jdbc.OracleTypes.INTEGER);//注册返回的结果集cs.registerOutParameter(6,oracle.jdbc.OracleTypes.CURSOR);cs.execute();//取出总记录数
/这里要注意,getInt(4)中4,是由该参数的位置决定的int
rowNum=cs.getInt(4);//获得输出参数int pageCount =
cs.getInt(5);rs=(ResultSet)cs.getObject(6);System.out.println(“rowNum=”+rowNum);System.out.println(“总页数=”+pageCount);while
(rs.next()) {System.out.println(“编号:”+rs.getInt(1)+”
名字:”+rs.getString(2)+” 密码:”+rs.getString(3));}} 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存储过程总结

//1、call+包名+存储过程名(传入、传出值用?)  
   String str=”{call SMSBUSINESS.deleteZhZMember(?,?,?)}”;
//2、建立连接
 Connection conn=null;
 conn=DriverManager.getConnection();
//3、使用java.sql.*类
 CallableStatement cs=conn.prepareCall(str);
//4、传入in值
 cs.setInt(1,id);
 cs.setInt(2,-2);
//5、设置out值
 cs.registerOutParameter(3,Types.NUMERIC);
//6、执行
 cs.excuse();
//7、取出out值
 int flag=cs.getInt(3);
//8、关连接
 conn.close();

文章引用自:

*********************************************************************************************************************

这段时间开始学习写存储过程,主要原因还是因为工作需要吧,本来以为很简单的,但几经挫折,豪气消磨殆尽,但总算搞通了,为了避免后来者少走弯路,特记述与此,同时亦对自己进行鼓励。

一:无返回值的存储过程

存储过程为:

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(?,?) }”); //设置存储过程
call为关键字.

      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_ID,I_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);//第二个参数输出参数,是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(?) }”); //存储过程
hyq包下的

     
proc.registerOutParameter(1,oracle.jdbc.OracleTypes.CURSOR);//设置输出参数是一个游标.第一个参数,游标类型

      proc.execute();//执行

      rs = (ResultSet)proc.getObject(1);
//获得第一个参数是一个游标,转化成ResultSet类型

 

      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路径里,否则会报错的。