java調用存儲過程(output和return) – JAVA編程語言程序開發技術文章

package callProcedure;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import oracle.jdbc.OracleTypes;
// 調用存儲過程
public class CallProcedure {
public static Connection con = null;
// 調用存儲過程,函數特有的封裝類
public static CallableStatement callableStatement = null;
public static ResultSet rs = null;
public static void main(String args[]) throws SQLException {
   System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>調用存儲過程<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<");
   // 調用無返回值的存儲過程
   callNoReturnValueProcedure();
   // 調用帶參數的存儲過程
   callParamProcedure();
   // 調用隻有一個返回值的存儲過程
   callOnlyOneReturnValueProcedure();
   // 調用有一組返回值的存儲過程
   callReturnValuesProcedure();
   System.out.println(">>>>>>>>>>>>>>>>>><<>>>>>>>>>>>調用函數<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<");
   // 調用有一個返回值的函數
   callReturnValueFunction();
}
////////////////////////////*******調用無返回值的存儲過程*******/////////////////////////////
public static void callNoReturnValueProcedure() throws SQLException {
   try {
    con = getConnection();
    callableStatement = con.prepareCall("{call noReturnValueProcedure}");
    callableStatement.execute();
   } catch (SQLException sqlException) {
    sqlException.printStackTrace();
   } catch (Exception e) {
    e.printStackTrace();
   } finally {
    close();
   }
   System.out.println("callNoReturnValueProcedure()無返回值存儲過程執行成功!");
}
/*
上面callNoReturnValueProcedure()調用的存儲過程如下:
   create or replace procedure noReturnValueProcedure is — 如果存儲過程沒有參數則不帶括號,如果寫成testProcedure()則報錯
   begin
    insert into cht.remarke_info
    values
      ('001',
       '001',
       to_char(sysdate, 'yyyymmdd'),
       to_char(sysdate, 'yyyymm'),
       'cht',
       '發展的還可以。',
       sysdate,
       100);
   end noReturnValueProcedure;
*/

//////////////////////////////*******調用帶參數的存儲過程*******//////////////////////////////
public static void callParamProcedure() throws SQLException {
   try {
    con = getConnection();
//    // 寫法一
//    callableStatement = con.prepareCall("{call paramProcedure('bonc-cht', 2001)}");
  
    // 寫法二
    callableStatement = con.prepareCall("{call paramProcedure(?, ?)}");
    callableStatement.setString(1, "bonc-cht");
    callableStatement.setInt(2, 3001);
  
    callableStatement.execute();
   } catch (SQLException sqlException) {
    sqlException.printStackTrace();
   } catch (Exception e) {
    e.printStackTrace();
   } finally {
    close();
   }
   System.out.println("callParamProcedure()帶參數存儲過程執行成功!");
}
/*
上面callParamProcedure()調用的存儲過程如下:
   create or replace procedure paramProcedure(userID varchar2, ramark_info_id number) is
    user_id varchar2(200); — 定義字符串類型的內部變量要聲明長度,否則報錯(如:user_id varchar2報錯),但是number類型的不用,如:v_id_no number;
   begin
    user_id := userID; — 賦值操作,寫成 userid = userID 也可以,一般都寫成::=
    insert into cht.remarke_info
    values
      ('002',
       '002',
       to_char(sysdate, 'yyyymmdd'),
       to_char(sysdate, 'yyyymm'),
       user_id, — 內部變量
       '發展的一般般。',
       sysdate,
       ramark_info_id); — 所傳參數變量
   end paramProcedure;
*/
/////////////////////////*******調用隻有一個返回值的存儲過程*******//////////////////////////
public static void callOnlyOneReturnValueProcedure() throws SQLException {
   try {
    con = getConnection();
    callableStatement = con.prepareCall("{call cht.onlyOneReturnValueProcedure(?, ?)}");
    callableStatement.setString(1, "fdasfdsa");
    // 設置返回值的類型2表示第二個參數www.aiwalls.com
    callableStatement.registerOutParameter(2, Types.INTEGER);
    callableStatement.execute();
    // 獲取返回值(一個)
    // 註意:callableStatement.getString(2)中的數值2並非任意的,而是和存儲過程中的out列對應的,
    // 如果out是在第一個位置,那就是callableStatement.getString(1),
    // 如果是第三個位置,就是callableStatement.getString(3)。
    // 當然也可以同時有多個返回值,那就是再多加幾個out參數瞭。
    int label_inst_id = callableStatement.getInt(2); // 註意:getInt(2)別寫成瞭getInt("2")
    System.out.println("callOnlyOneReturnValueProcedure()隻有一個返回值的存儲過程的返回值(最大值):" + label_inst_id);
   } catch (SQLException sqlException) {
    sqlException.printStackTrace();
   } catch (Exception e) {
    e.printStackTrace();
   } finally {
    close();
   }
}
/*
上面callOnlyOneReturnValueProcedure()調用的存儲過程如下:
   說明:存儲過程隻能通過output參數來返回結果,隻要在存儲過程已經給這個輸出參數賦值瞭,它就能返回回去
     這種返回方式可以返回多個值,通過return返回值隻是應用在函數function中
    create or replace procedure onlyOneReturnValueProcedure(user_ID in varchar2, max_label_inst_id out number) is
    begin
    select max(t.remarke_info_id)
       into max_label_inst_id  —賦瞭值,能自動將該值返回
       from cht.remarke_info t
      where t.user_id = user_ID;
    end onlyOneReturnValueProcedure;
*/
///////////////////////////////*******調用有一組返回值的存儲過程*******////////////////////////////
public static void callReturnValuesProcedure() throws SQLException {
   try {
    con = getConnection();
    callableStatement = con.prepareCall("{call getRemarke_info(?, ?)}");
    callableStatement.setString(1, "cht");
    // 預設輸出結果的類型
    callableStatement.registerOutParameter(2, OracleTypes.CURSOR);
    callableStatement.execute();
    // 將結果轉化成結果集
    rs = (ResultSet)callableStatement.getObject(2);
    int i = 0;
    while (rs.next()) {
     System.out.println(rs.getString(1) + "\t" +
       rs.getString(2) + "\t" +
       rs.getString(3) + "\t" +
       rs.getString(4) + "\t" +
       rs.getString(5) + "\t" +
       rs.getString(6) + "\t" +
       rs.getString(7) + "\t" +
       rs.getString(8));
     i ++;
    }
    System.out.println("調用有一組返回值的存儲過程callReturnValuesProcedure()執行成功,有" + i + "條記錄!");
   } catch (SQLException sqlException) {
    sqlException.printStackTrace();
   } catch (Exception e) {
    e.printStackTrace();
   } finally {
    close();
   }
}
/*
上面callReturnValuesProcedure()調用的包和存儲過程(過程要返回一個結果集,要用到包和遊標)如下:
   包:
    create or replace package myPackage as    —as和is意思一樣
     type cur is ref cursor; —聲明遊標
     procedure getRemarke_info(userId in varchar2, outputValue out cur);   —過程,函數等放在可以放在包裡面,打包
    end myPackage;
   存儲過程:
    create or replace procedure getRemarke_info(userId in varchar2, outputValue out myPackage.cur) is    —as和is意思一樣
    begin
     open outputValue for —打開遊標,存放結果
       select * from cht.remarke_info t where t.user_id = userId;
    end getRemarke_info;
*/
////////////////////////////*******調用有一個返回值的函數*******/////////////////////////////
public static void callReturnValueFunction() throws SQLException {
   try {
    con = getConnection();
    callableStatement = con.prepareCall("{? = call returnValuFunction(?)}"); // 如果函數無輸入參數,則不要帶括號如:returnValuFunction,帶瞭反而報錯,如:returnValuFunction()
    callableStatement.registerOutParameter(1, Types.VARCHAR);
    callableStatement.setString(2, "cht");
    callableStatement.execute();
  
    // 獲取函數返回值getString(1)表示第一個問號(返回值)
    String output = callableStatement.getString(1);
    System.out.println("callReturnValueFunction()有一個返回值的函數執行成功!返回結果:" + output);
   } catch (SQLException sqlException) {
    sqlException.printStackTrace();
   } catch (Exception e) {
    e.printStackTrace();
   } finally {
    close();
   }
}
/*
上面callReturnValueFunction()調用的函數如下:
   create or replace function returnValuFunction(param varchar2) return varchar2 is —return varchar2(varchar, number…);如果函數無輸入參數,則不要帶括號如:returnValuFunction,帶瞭反而報錯,如:returnValuFunction()
    return_value varchar2(20);   — 內部字符串變量必須聲明長度
   begin
    select count(*)
      into return_value
    from
      cht.remarke_info t
    where t.user_id = param;
    return return_value;
   end returnValuFunction;
*/

////////////////////////////////*******數據庫操作的相關方法*******//////////////////////////////
// 建立數據庫連接
public static Connection getConnection() {
   // 本工程所引的jar包
   String driver = "oracle.jdbc.driver.OracleDriver";
   // 註意thin:別少瞭:
   String url = "jdbc:oracle:thin:@133.64.140.45:1521:orcl";
   String userName = "cht";
   String password = "cht";
   Connection con = null;
   try {
    Class.forName(driver);
    con = DriverManager.getConnection(url, userName, password);
   } catch (SQLException sqlException) {
    sqlException.printStackTrace();
   } catch (Exception e) {
    e.printStackTrace();
   }
   return con;
}
// 關閉數據庫操作
public static void close() {
   try {
    if (rs != null) {
     rs.close();
    }
    if (callableStatement != null) {
     callableStatement.close();
    }
    if (con != null) {
     con.close();
    }
   } catch (SQLException e) {
    e.printStackTrace();
   } catch (Exception e1) {
    e1.printStackTrace();
   }
}
}
/*
本文件中所用表的表結構如下:
CREATE TABLE "CHT"."REMARKE_INFO"
   ( "LABEL_INST_ID" VARCHAR2(200),
"DATE_TYPE" VARCHAR2(5),
"DAY_ID" VARCHAR2(8),
"MONTH_ID" VARCHAR2(6),
"USER_ID" VARCHAR2(20),
"REMARKE_CONTENT" VARCHAR2(500),
"REMARKE_DATE" DATE,
"REMARKE_INFO_ID" NUMBER
   )
*/ 

摘自  執行夢想代碼 

發佈留言