首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

SQL*Plus 與 Java JDBC 呼叫帶 IN/OUT 參數的 Oracle 預存程序

     編輯:Java 相關知識

資料庫端:建立測試程序

CREATE OR REPLACE PROCEDURE TEST_PROCEDURE1 (
    PARAM1 IN VARCHAR2,
    PARAM2 IN OUT VARCHAR2,
    PARAM3 IN OUT NUMBER
) IS
BEGIN
    PARAM2 := '88888';
    PARAM3 := 0;
END TEST_PROCEDURE1;
/

SQL*Plus 匿名區塊呼叫

SQL*Plus 不直接支援 EXEC 呼叫 IN/OUT 參數,需用 PL/SQL 區塊:

SET SERVEROUTPUT ON
DECLARE
    v_param1 VARCHAR2(10) := '810';
    v_param2 VARCHAR2(10) := '1';
    v_param3 NUMBER := 1;
BEGIN
    TEST_PROCEDURE1(v_param1, v_param2, v_param3);
    DBMS_OUTPUT.PUT_LINE('PARAM2 = ' || v_param2);
    DBMS_OUTPUT.PUT_LINE('PARAM3 = ' || v_param3);
END;
/

輸出:

PARAM2 = 88888
PARAM3 = 0

Java JDBC CallableStatement 完整範例

Connection conn = DriverManager.getConnection(url, user, pass);
String sql = "{call TEST_PROCEDURE1(?, ?, ?)}";
CallableStatement cs = conn.prepareCall(sql);

// 1. 設定 IN 參數
cs.setString(1, "810");      // PARAM1 (IN)
cs.setString(2, "1");        // PARAM2 (IN OUT) - 初始值
cs.setInt(3, 1);             // PARAM3 (IN OUT) - 初始值

// 2. 註冊 OUT 參數型別(必須在 execute 前)
cs.registerOutParameter(2, Types.VARCHAR); // PARAM2
cs.registerOutParameter(3, Types.NUMERIC); // PARAM3

// 3. 執行
cs.execute();

// 4. 取得 OUT 參數值
String outParam2 = cs.getString(2);
int    outParam3 = cs.getInt(3);

System.out.println("PARAM2 = " + outParam2); // 88888
System.out.println("PARAM3 = " + outParam3); // 0

cs.close();
conn.close();

關鍵細節

  • 參數索引從 1 起算,對應 SQL 中 ? 位置。
  • registerOutParameter 必須在 execute() 之前呼叫,且型別需與資料庫定義對應(VARCHAR2 → Types.VARCHAR, NUMBER → Types.NUMERIC)。
  • IN/OUT 參數需先 setXxx 給初始值,再 registerOutParameter,執行後再 getXxx 取回。
  • Oracle 12c+ 支援 TRY-WITH-RESOURCES 自動關閉 CallableStatement。

進階:使用命名參數 (Oracle JDBC 專屬)

OracleCallableStatement ocs = (OracleCallableStatement) conn.prepareCall(sql);
ocs.setStringAtName("PARAM1", "810");
ocs.setStringAtName("PARAM2", "1");
ocs.setIntAtName("PARAM3", 1);
ocs.registerOutParameter("PARAM2", Types.VARCHAR);
ocs.registerOutParameter("PARAM3", Types.NUMERIC);
ocs.execute();
String p2 = ocs.getString("PARAM2");
int p3 = ocs.getInt("PARAM3");

可讀性更高,但綁定 Oracle 驅動。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved