java oracle 存储过程(有返回值)返回列表--》学习二(转载+修改)

来源:互联网 发布:北京网络职业学院 编辑:程序博客网 时间:2024/06/05 03:17

由于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 TESTTB;
END TESTC;

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

接下来新建一个类

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


public TestProcedureTHREE() {
 }
 public static void main(String[] args ){
   String driver = "oracle.jdbc.driver.OracleDriver";
   String strUrl = "jdbc:oracle:thin:@192.168.0.200:1521:orcl";
   Statement stmt = null;
   ResultSet rs = null;
   Connection conn = null;
 
   try {
     Class.forName(driver);
     conn =  DriverManager.getConnection(strUrl, "hn628", "123456");
 
     CallableStatement proc = null;
     proc = conn.prepareCall("{ call 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) {
     }
   }
 }
}


原创粉丝点击