存儲過程通過 OUT 參數返回標量值是最常見交互模式。本文提供標準 PL/SQL 定義、完整 Java 調用代碼、參數註冊映射規則、資源管理模板,可直接複製落地。
CREATE OR REPLACE PROCEDURE testb (
para1 IN VARCHAR2,
para2 OUT VARCHAR2
) AS
BEGIN
SELECT col_name INTO para2 FROM testtb WHERE i_id = para1;
END testb;
package com.example.proc;
import java.sql.*;
public class CallProcWithOutParam {
public static void main(String[] args) {
String driver = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
String user = "scott";
String pwd = "tiger";
Connection conn = null;
CallableStatement proc = null;
try {
Class.forName(driver);
conn = DriverManager.getConnection(url, user, pwd);
// {call schema.proc(?,?)} 占位符順序 = 參數定義順序
proc = conn.prepareCall("{ call testb(?, ?) }");
proc.setString(1, "100"); // IN 參數
proc.registerOutParameter(2, Types.VARCHAR); // OUT 參數註冊,索引=位置
proc.execute();
String result = proc.getString(2); // 獲取 OUT 值
System.out.println("返回結果 = " + result);
} catch (SQLException | ClassNotFoundException e) {
e.printStackTrace();
} finally {
closeQuietly(proc);
closeQuietly(conn);
}
}
static void closeQuietly(AutoCloseable c) {
if (c != null) try { c.close(); } catch (Exception ignored) {}
}
}
registerOutParameter(2, ...) 對應第 2 個參數;若 OUT 在第 1 位則用 1,第 3 位用 3。Types.VARCHAR/INTEGER/DATE/TIMESTAMP/NUMERIC 對應 Oracle VARCHAR2/NUMBER/DATE/TIMESTAMP/NUMBER。registerOutParameter(n, type),getString(n) 獲取。