用java调用oracle存储过程总结二
?
這段時(shí)間開(kāi)始學(xué)習(xí)寫(xiě)存儲(chǔ)過(guò)程,主要原因還是因?yàn)楣ぷ餍枰?#xff0c;本來(lái)以為很簡(jiǎn)單的,但幾經(jīng)挫折,豪氣消磨殆盡,但總算搞通了,為了避免后來(lái)者少走彎路,特記述與此,同時(shí)亦對(duì)自己進(jìn)行鼓勵(lì)。
一:無(wú)返回值的存儲(chǔ)過(guò)程
存儲(chǔ)過(guò)程為:
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里調(diào)用時(shí)就用下面的代碼:
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(?,?) }");
????? 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) {
????? }
??? }
? }
}
當(dāng)然了,這就先要求要建張表TESTTB,里面兩個(gè)字段(I_ID,I_NAME)。
二:有返回值的存儲(chǔ)過(guò)程(非列表)
存儲(chǔ)過(guò)程為:
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里調(diào)用時(shí)就用下面的代碼:
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)中的數(shù)值2并非任意的,而是和存儲(chǔ)過(guò)程中的out列對(duì)應(yīng)的,如果out是在第一個(gè)位置,那就是proc.getString(1),如果是第三個(gè)位置,就是proc.getString(3),當(dāng)然也可以同時(shí)有多個(gè)返回值,那就是再多加幾個(gè)out參數(shù)了。
三:返回列表
由于oracle存儲(chǔ)過(guò)程沒(méi)有返回值,它的所有返回值都是通過(guò)out參數(shù)來(lái)替代的,列表同樣也不例外,但由于是集合,所以不能用一般的參數(shù),必須要用pagkage了.所以要分兩部分,
1,? 建一個(gè)程序包。如下:
CREATE OR REPLACE PACKAGE TESTPACKAGE ?AS
?TYPE Test_CURSOR IS REF CURSOR;
end TESTPACKAGE;
2,建立存儲(chǔ)過(guò)程,存儲(chǔ)過(guò)程為:
CREATE OR REPLACE PROCEDURE TESTC(p_CURSOR out TESTPACKAGE.Test_CURSOR) IS
BEGIN
??? OPEN p_CURSOR FOR SELECT * FROM HYQ.TESTTB;
END TESTC;
可以看到,它是把游標(biāo)(可以理解為一個(gè)指針),作為一個(gè)out 參數(shù)來(lái)返回值的。
在java里調(diào)用時(shí)就用下面的代碼:
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("<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) {
????? }
??? }
? }
}
在這里要注意,在執(zhí)行前一定要先把oracle的驅(qū)動(dòng)包放到class路徑里,否則會(huì)報(bào)錯(cuò)的。
總結(jié)
以上是生活随笔為你收集整理的用java调用oracle存储过程总结二的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 用java调用oracle存储过程总结一
- 下一篇: spring+hibernate的配置