java下實現調用oracle的存儲過程和函數

在oracle下建立一個test的帳戶,而後按一下步驟執行:java

1.建立表:STOCK_PRICES

--建立表格
CREATE TABLE STOCK_PRICES(
    RIC VARCHAR(6) PRIMARY KEY,
    PRICE NUMBER(7,2),
    UPDATED DATE );

2.插入測試數據:

--插入數據
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);

3.創建一個返回遊標: PKG_PUB_UTILS

--創建一個返回遊標
CREATE OR REPLACE PACKAGE PKG_PUB_UTILS IS
    --動態遊標
    TYPE REFCURSOR IS REF CURSOR;END PKG_PUB_UTILS;

4.建立和存儲過程:P_GET_PRICE

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

5.建立函數:

--建立函數:
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;

6.JAVA調用存儲過程返回結果集

代碼示例: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();
    }
}

7.開發JAVA調用函數返回結果集

代碼示例: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();
    }
}
相關文章
相關標籤/搜索