威尼斯www.9778.com-威尼斯正版官方网站

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

日期:2020-01-15编辑作者:服务器&运维

复制代码 代码如下:
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 {

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

 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;
   //创建CallableStatement
   cs = 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) {
   }
  }
 }
}

本文由威尼斯www.9778.com发布于服务器&运维,转载请注明出处:oracle分页存储过程 oracle存储过程实例

关键词:

忘记oracle的sys客商密码怎么订正威尼斯www.9778.com

我们在通过   一、忘记除SYS、SYSTEM用户之外的用户的登录密码。 用SYS (或SYSTEM)用户登录: CONN SYS/PASS_WORD AS SYSDBA; 使用...

详细>>

oracle中to

SYSDATE               TO_CHAR(SYSDATE,'HH')     -------------------- ---------------------     2003-10-13 19:35:21   07    6...

详细>>

11g Oracle导出表 默认不导出数据为空的表解决

  11g oracle导出表时会默认不导出数据为空 解决方案: 解决方法如下: 1、Oracle11g默认对空表不分配segment,故使用e...

详细>>

在Tomcat服务器下使用连接池连接Oracle数据库

四:提供一个jsp页面: 复制代码 代码如下: 在C:/Program Files/Tomcat5.5.7/conf/下建立context.xml,在E:/MyWorkSpace/test下新建WE...

详细>>