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 不直接支援 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
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();
? 位置。registerOutParameter 必須在 execute() 之前呼叫,且型別需與資料庫定義對應(VARCHAR2 → Types.VARCHAR, NUMBER → Types.NUMERIC)。setXxx 給初始值,再 registerOutParameter,執行後再 getXxx 取回。TRY-WITH-RESOURCES 自動關閉 CallableStatement。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 驅動。