1. 程式人生 > >做一個,記一篇 — Java調用Oracle存儲過程

做一個,記一篇 — Java調用Oracle存儲過程

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存儲過程