做一個,記一篇 — Java調用Oracle存儲過程
阿新 • • 發佈:2018-05-19
cst lose imp 遊標 let 實現 bject 一起 main
一、需求
傳入一個參數,返回多條記錄(列表)。
二、實現步驟
1. 編寫Oracle存儲過程。
-- 聲明包和包體的語句應該分兩次執行,即使聲明在前定義在後,如果一起執行依然會編譯出錯 -- 調用能夠返回多條記錄的存儲過程需要定義在包內 --聲明包及包內的遊標、存儲過程 CREATE OR REPLACE PACKAGE pack_myPackage IS TYPE myCursor IS REF CURSOR; PROCEDURE proc_querySomeInfo(pNo IN VARCHAR2, myCursor OUT myCursor);END myPackage; --定義包體 CREATE OR REPLACE PACKAGE BODY pack_myPackage IS PROCEDURE proc_querySomeInfo(pNo IN VARCHAR2, outcursor OUT myCursor) IS BEGIN OPEN outcursor FOR SELECT * FROM tableA WHERE P_NO = pNo; END proc_querySomeInfo; END pack_myPackage;
2. 編寫Java代碼
package vip.yaocn.test;import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet;/** * 存儲過程測試 * * @author yacon */ public class ProcedureTest { public static void main(String[] args) throws Exception { String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl"; String driverName= "oracle.jdbc.driver.OracleDriver"; String username = "scott"; String password = "tiger"; Connection conn = null; CallableStatement cstmt = null; ResultSet rs = null; try { Class.forName(driverName); conn = DriverManager.getConnection(url, username, password); String callSql = "{call pack_myPackage.proc_getSomeInfo(?, ?) }"; cstmt = conn.prepareCall(callSql); cstmt.setString(1, "1001"); cstmt.registerOutParameter(2, oracle.jdbc.OracleTypes.CURSOR); cstmt.execute(); rs = (ResultSet) cstmt.getObject(2); if (rs != null) { while (rs.next()) { System.out.println(rs.getString(1)); } } } catch (Exception e) { e.printStackTrace(); } finally { try { if (rs != null) { rs.close(); } } catch (Exception e) { e.printStackTrace(); } try { if (cstmt != null) { cstmt.close(); } } catch (Exception e) { e.printStackTrace(); } try { if (conn != null) { conn.close(); } } catch (Exception e) { e.printStackTrace(); } } } }
3. 拓展知識
(1)
做一個,記一篇 — Java調用Oracle存儲過程