首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Java 呼叫 Oracle 無回傳值預存程序完整實作指南

     編輯:Oracle 資料庫基礎

在企業級 Java 應用中,呼叫 Oracle 預存程序執行資料操作(INSERT/UPDATE/DELETE)是常見需求。本文以「無回傳值」預存程序為例,完整示範從資料庫端建立程序、Java 端使用 CallableStatement 呼叫、參數綁定、異常處理到資源釋放的標準化流程,並說明關鍵細節與最佳實踐。

資料庫端:建立無回傳值預存程序

CREATE OR REPLACE PROCEDURE TESTA (
  PARA1 IN VARCHAR2,
  PARA2 IN VARCHAR2
) AS
BEGIN
  INSERT INTO HYQ.B_ID (I_ID, I_NAME) VALUES (PARA1, PARA2);
END TESTA;

說明:

  • 僅定義 IN 模式參數,無 OUT / IN OUT 參數。
  • 業務邏輯為單純 INSERT,提交由呼叫端控制(預設自動提交或手動 conn.commit())。
  • 預先建立測試表 HYQ.B_ID (I_ID, I_NAME)。

Java 端:標準呼叫範本

package com.hyq.src;

import java.sql.*;

public class TestProcedureOne {

    public static void main(String[] args) {
        String driver  = "oracle.jdbc.driver.OracleDriver";
        String url     = "jdbc:oracle:thin:@127.0.0.1:1521:hyq";
        String user    = "hyq";
        String password= "hyq";

        Connection conn = null;
        CallableStatement cstmt = null;

        try {
            Class.forName(driver);
            conn = DriverManager.getConnection(url, user, password);

            // 1. 準備呼叫語法:{call 程序名(?,?)}
            String sql = "{call HYQ.TESTA(?,?)}";
            cstmt = conn.prepareCall(sql);

            // 2. 綁定 IN 參數(索引從 1 開始)
            cstmt.setString(1, "100");
            cstmt.setString(2, "TestOne");

            // 3. 執行
            cstmt.execute();
            System.out.println("預存程序執行成功");

        } catch (ClassNotFoundException e) {
            System.err.println("找不到 JDBC 驅動類別:" + e.getMessage());
        } catch (SQLException e) {
            System.err.println("資料庫錯誤:" + e.getMessage());
            e.printStackTrace();
        } finally {
            // 4. 依序關閉資源(避免洩漏)
            closeQuietly(cstmt);
            closeQuietly(conn);
        }
    }

    private static void closeQuietly(AutoCloseable resource) {
        if (resource != null) {
            try { resource.close(); } catch (Exception ignore) {}
        }
    }
}

關鍵技術點深度解析

1. CallableStatement 與 prepareCall

  • 使用 JDBC 標準逃逸語法 {call ...},跨資料庫可攜性較好。
  • 若程序在特定 Schema,必須加上 Schema 前綴:{call SCHEMA.PROC_NAME(?,?)}。

2. 參數綁定順序與型別對應

Oracle 型別Java setter備註
VARCHAR2 / CHARsetString最常用
NUMBERsetInt / setLong / setBigDecimal視精度選擇
DATE / TIMESTAMPsetDate / setTimestamp需 java.sql.* 型別
CLOB / BLOBsetClob / setBlob大物件需分塊處理

3. 交易控制與自動提交

  • 若連線 autoCommit=true(預設),execute() 後立即提交。
  • 需原子性操作時:conn.setAutoCommit(false),執行完多個程序後 conn.commit(),異常時 conn.rollback()。

4. 資源釋放最佳實踐(Java 7+ try-with-resources)

try (Connection conn = DriverManager.getConnection(url, user, password);
     CallableStatement cstmt = conn.prepareCall("{call HYQ.TESTA(?,?)}")) {

    cstmt.setString(1, "100");
    cstmt.setString(2, "TestOne");
    cstmt.execute();
} catch (SQLException e) {
    e.printStackTrace();
}

此寫法自動關閉 Connection、CallableStatement,程式碼更簡潔安全。

常見錯誤與排查

  • ORA-06550 / PLS-00306:參數數量、型別、順序不匹配,核對 SQL 定義與 Java 綁定。
  • ClassNotFoundException:確認 ojdbc8.jar(或對應版本)已在 Classpath。
  • 連線逾時:檢查 URL 格式 jdbc:oracle:thin:@host:port:service_name、防火牆、監聽器。

掌握此標準流程,即可在 Java 應用中穩健、高效地呼叫 Oracle 無回傳值預存程序,滿足批次處理、資料同步等企業級需求。

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