JAVA調用oracle三種存儲過程實例

JAVA調用存儲過程:
幾經挫折,但總算搞通了,爲了避免後來者少走彎路,特記述與此,同時亦對自己進行鼓勵。

創建測試用表: 

CREATE TABLE T_TEST(
I_ID 
NVARCHAR(20),
I_NAME 
NVARCHAR(20)
)

一:無返回值的存儲過程

1、在SQL*PLUS中建立存儲過程:


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

BEGIN 

   
INSERT INTO T_TEST (I_ID,I_NAME) VALUES (PARA1, PARA2);

END TESTA;


2、相應的JAVA程序:

 

package com.my.test;

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 TestProcedureOne {
    
public TestProcedureOne() 

      }
 

      
public static void main(String[] args )

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

        String strUrl 
= "jdbc:oracle:thin:@192.168.10.216:1521:ctbu"

        Statement stmt 
= null

        ResultSet rs 
= null

        Connection conn 
= null

        CallableStatement cstmt 
= null

      

        
try 

          Class.forName(driver); 

          conn 
=  DriverManager.getConnection(strUrl, "dbname""password"); 

          CallableStatement proc 
= null

          proc 
= conn.prepareCall("{ call dbname.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) 

          }
 

        }
 

      }
 

    }
 


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

1、存儲過程爲:

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

BEGIN 

   
SELECT INTO PARA2 FROM TESTTB WHERE I_ID= PARA1; 

END TESTB;

2、JAVA代碼:

package com.my.test;
public class TestProcedureTWO {

  
public TestProcedureTWO() {

  }


  
public static void main(String[] args ){

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

    String strUrl 
= "jdbc:oracle:thin:@192.168.10.216:1521:ctbu"

    Statement stmt 
= null;

    ResultSet rs 
= null;

    Connection conn 
= null;

    
try {

      Class.forName(driver);

      conn 
=  DriverManager.getConnection(strUrl, "dbname""password"); 

      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、在SQL*PLUS中建一個程序包

CREATE OR REPLACE PACKAGE TESTPACKAGE  AS  
TYPE Test_CURSOR 
IS REF CURSOR
procedure TESTC(cur_ref out Test_CURSOR); 
end TESTPACKAGE; 

建立存儲過程,存儲過程爲:


create or replace package body TESTPACKAGE as 
procedure TESTC(cur_ref out Test_CURSOR) is 
begin   
OPEN cur_ref FOR SELECT * FROM T_TEST;
end TESTC;
END TESTPACKAGE;

可以看到,它是把遊標(可以理解爲一個指針),作爲一個out 參數來返回值的。

JAVA程序如下:

package com.my.test;

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 TestProcedureOne {
    
public TestProcedureOne() ...

      }
 

      
public static void main(String[] args )

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

        String strUrl 
= "jdbc:oracle:thin:@192.168.10.216:1521:ctbu"

        Statement stmt 
= null

        ResultSet rs 
= null

        Connection conn 
= null

        CallableStatement cstmt 
= null

      

        
try 

          Class.forName(driver); 

          conn 
= DriverManager.getConnection(strUrl,"databasename" "password"); 

          CallableStatement proc 
= null

          proc 
= conn.prepareCall("{ call cqsb.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) 

          }
 

        }
 

      }
 

    }
 

特別注意:
1、在執行前一定要先把oracle的驅動包放到class路徑裏。

2、Toad在我建立存儲過程中搞了很多莫名的錯誤,多數是沒有創建成功而不報錯,或者是創建有誤而不提示,應當引起重視。所以最好還是在SQL*PLUS玩這些。

3、在SQL*PLUS中的換行是無效的,要換行的時候一定要空格結尾,特別是你直接複製代碼的時候!

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章