在oracle下建立一個test的帳戶,而後按一下步驟執行:java
--建立表格 CREATE TABLE STOCK_PRICES( RIC VARCHAR(6) PRIMARY KEY, PRICE NUMBER(7,2), UPDATED DATE );
--插入數據 INSERT INTO stock_prices values('1111',1.0,SYSDATE); INSERT INTO stock_prices values('1112',2.0,SYSDATE); INSERT INTO stock_prices values('1113',3.0,SYSDATE); INSERT INTO stock_prices values('1114',4.0,SYSDATE);
--創建一個返回遊標 CREATE OR REPLACE PACKAGE PKG_PUB_UTILS IS --動態遊標 TYPE REFCURSOR IS REF CURSOR;END PKG_PUB_UTILS;
--建立存儲過程 CREATE OR REPLACE PROCEDURE P_GET_PRICE ( AN_O_RET_CODE OUT NUMBER, AC_O_RET_MSG OUT VARCHAR2, CUR_RET OUT PKG_PUB_UTILS.REFCURSOR, AN_I_PRICE IN NUMBER ) IS BEGIN AN_O_RET_CODE := 0; AC_O_RET_MSG := '操做成功'; OPEN CUR_RET FOR SELECT * FROM STOCK_PRICES WHERE PRICE<AN_I_PRICE; EXCEPTION WHEN OTHERS THEN AN_O_RET_CODE := -1; AC_O_RET_MSG := '錯誤代碼:' || SQLCODE || CHR(13) || '錯誤信息:' || SQLERRM; END P_GET_PRICE;
--建立函數: F_GET_PRICECREATE OR REPLACE FUNCTION F_GET_PRICE(v_price IN NUMBER) RETURN PKG_PUB_UTILS.REFCURSOR AS stock_cursor PKG_PUB_UTILS.REFCURSOR; BEGIN OPEN stock_cursor FOR SELECT * FROM stock_prices WHERE price < v_price; RETURN stock_cursor; END;
代碼示例:JDBCoracle10G_INVOKEPROCEDURE.javasql
import java.sql.*; import oracle.jdbc.OracleCallableStatement; import oracle.jdbc.OracleTypes; /* 本例是經過調用oracle的存儲過程來返回結果集: * oracle 9i、10G 的jdbc由1個jar包組成:classes12.zip */ public class JDBCoracle10G_INVOKEPROCEDURE { Connection conn = null; Statement statement = null; ResultSet rs = null; CallableStatement stmt = null; String driver; String url; String user; String pwd; String sql; String in_price; public JDBCoracle10G_INVOKEPROCEDURE() { driver = "oracle.jdbc.driver.OracleDriver"; url = "jdbc:oracle:thin:@localhost:1521:ORCL"; // oracle 用戶 user = "test"; // oracle 密碼 pwd = "test"; init(); // mysid:必須爲要鏈接機器的sid名稱,不然會包如下錯: // java.sql.SQLException: Io 異常: Connection // refused(DESCRIPTION=(TMP=)(VSNNUM=169870080)(ERR=12505)(ERROR_STACK=(ERROR=(CODE=12505)(EMFI=4)))) // 參考鏈接方式: // Class.forName( "oracle.jdbc.driver.OracleDriver" ); // cn = DriverManager.getConnection( // "jdbc:oracle:thin:@MyDbComputerNameOrIP:1521:ORCL", sUsr, sPwd ); } public void init() { System.out.println("oracle jdbc test"); try { Class.forName(driver); System.out.println("driver is ok"); conn = DriverManager.getConnection(url, user, pwd); System.out.println("conection is ok"); statement = conn.createStatement(); // conn.setAutoCommit(false); // 輸入參數 in_price = "3.0"; // 調用函數 stmt = conn.prepareCall("call P_GET_PRICE(?,?,?,?)"); stmt.registerOutParameter(1, java.sql.Types.FLOAT); stmt.registerOutParameter(2, java.sql.Types.CHAR); stmt.registerOutParameter(3, oracle.jdbc.OracleTypes.CURSOR); stmt.setString(4, in_price); stmt.executeUpdate(); int retCode = stmt.getInt(1); String retMsg = stmt.getString(2); if (retCode == -1) { // 若是出錯時,返回錯誤信息 System.out.println("報錯!"); } else { // 取的結果集的方式一: rs = ((OracleCallableStatement) stmt).getCursor(3); // 取的結果集的方式二: // rs = (ResultSet) stmt.getObject(3); String ric; String price; String updated; // 對結果進行輸出 while (rs.next()) { ric = rs.getString(1); price = rs.getString(2); updated = rs.getString(3); System.out.println("ric:" + ric + ";-- price:" + price + "; --" + updated + "; "); } } } catch (Exception e) { e.printStackTrace(); } finally { System.out.println("close "); } } public static void main(String args[])// 本身替換[] { new JDBCoracle10G_INVOKEPROCEDURE(); } }
代碼示例:JDBCoracle10G_INVOKEFUNCTION.javaoracle
import java.sql.*; import oracle.jdbc.OracleCallableStatement; import oracle.jdbc.OracleTypes; /* /* 本例是經過調用oracle的函數來返回結果集: * oracle 9i、10G 的jdbc由1個jar包組成:classes12.zip */ public class JDBCoracle10G_INVOKEFUNCTION { Connection conn = null; Statement statement = null; ResultSet rs = null; CallableStatement stmt = null; String driver; String url; String user; String pwd; String sql; String in_price; public JDBCoracle10G_INVOKEFUNCTION() { driver = "oracle.jdbc.driver.OracleDriver"; url = "jdbc:oracle:thin:@localhost:1521:ORCL"; // oracle 用戶 user = "test"; // oracle 密碼 pwd = "test"; init(); // mysid:必須爲要鏈接機器的sid名稱,不然會包如下錯: // java.sql.SQLException: Io 異常: Connection // refused(DESCRIPTION=(TMP=)(VSNNUM=169870080)(ERR=12505)(ERROR_STACK=(ERROR=(CODE=12505)(EMFI=4)))) // 參考鏈接方式: // Class.forName( "oracle.jdbc.driver.OracleDriver" ); // cn = DriverManager.getConnection( // "jdbc:oracle:thin:@MyDbComputerNameOrIP:1521:ORCL", sUsr, sPwd ); } public void init() { System.out.println("oracle jdbc test"); try { Class.forName(driver); System.out.println("driver is ok"); conn = DriverManager.getConnection(url, user, pwd); System.out.println("conection is ok"); statement = conn.createStatement(); // conn.setAutoCommit(false); // 輸入參數 in_price = "5.0"; // 調用函數 stmt = conn.prepareCall("{? = call F_GET_PRICE(?)}"); // stmt.registerOutParameter(1, java.sql.Types.FLOAT); // stmt.registerOutParameter(2, java.sql.Types.CHAR); stmt.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR); stmt.setString(2, in_price); stmt.executeUpdate(); // 取的結果集的方式一: rs = ((OracleCallableStatement) stmt).getCursor(1); // 取的結果集的方式二: // rs = (ResultSet) stmt.getObject(1); String ric; String price; String updated; while (rs.next()) { ric = rs.getString(1); price = rs.getString(2); updated = rs.getString(3); System.out.println("ric:" + ric + ";-- price:" + price + "; --" + updated + "; "); } } catch (Exception e) { e.printStackTrace(); } finally { System.out.println("close "); } } public static void main(String args[])// 本身替換[] { new JDBCoracle10G_INVOKEFUNCTION(); } }