Java調用存儲過程

          Posted on 2008-01-26 16:00 flustar 閱讀(299) 評論(0)  編輯  收藏 所屬分類: Java

           

          一:無返回值的存儲過程

          存儲過程為:

          create or replace procedure adddept(deptno number,dname varchar2,loc varchar2)

           as

          begin

           insert into dept values(deptno,dname,loc);

           end;

          然后呢,在java里調用時就用下面的代碼:

          public class TestProcedure {

          Connection conn=null ;

          CallableStatement cstmt=null ;

           PreparedStatement pstmt=null ;

          String url="jdbc:oracle:thin:@localhost:1521:mydb";

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

          String name="";

           public TestProcedure() {

           try {

           Class.forName(driver);

           conn=DriverManager.getConnection(url,"scott","tiger");

          cstmt=conn.prepareCall("{call adddept(?,?,?)}");

          cstmt.setInt(1,13);

           cstmt.setString(2,"間諜部2");

          cstmt.setString(3,"ningbo2");

          cstmt.executeUpdate();

           

           System.out.println("success");

           }

           catch (Exception e){e.printStackTrace();}

          finally{

          cstmt.close();

          conn.close();

           }

           }

          }

          dept表為oracle數據庫方案scott中的一個表

          二:有返回值的存儲過程(非列表)

          存儲過程為:

          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( rs.getString(1) + "  "+rs.getString(2));

          }

          }

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

          }

          }

          }

          }

          posts - 146, comments - 143, trackbacks - 0, articles - 0

          Copyright © flustar

          主站蜘蛛池模板: 临汾市| 柳林县| 沅陵县| 台中县| 澄城县| 吉安县| 阿克苏市| 辉县市| 丘北县| 西丰县| 如皋市| 樟树市| 景德镇市| 绥化市| 遵化市| 木里| 永平县| 金阳县| 山东省| 东兴市| 东宁县| 靖州| 连平县| 分宜县| 娱乐| 松滋市| 兴隆县| 确山县| 元朗区| 依安县| 衡山县| 洛扎县| 阳原县| 遂川县| 益阳市| 巫山县| 砚山县| 德钦县| 青海省| 拉孜县| 永善县|