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

PHP OCI8 擴展操作 Oracle 8/7 數據庫完全指南

     編輯:Oracle 資料庫基礎

環境準備

PHP OCI8 擴展基於 Oracle OCI (Oracle Call Interface) 客戶端庫,**必須**在運行 PHP 的機器上安裝 Oracle Instant Client 或完整 Client,並設置關鍵環境變量:

# Linux/Unix 典型設置
export ORACLE_HOME=/opt/oracle/instantclient_19_8
export LD_LIBRARY_PATH=$ORACLE_HOME:$LD_LIBRARY_PATH
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
export ORACLE_SID=ORCL  # 可選,用於本地連接

Web 服務器進程用戶(如 www-data、nobody)需具備讀取客戶端庫權限,建議將用戶加入 `oinstall` 組。

核心編程模型

  1. OCILogon / OCIPLogon(持久連接)建立連接。
  2. OCIParse 解析 SQL/PLSQL。
  3. OCIBindByName 綁定 PHP 變量到佔位符(支持全局/局部變量、IN/OUT/INOUT)。
  4. OCIExecute 執行,模式:`OCI_DEFAULT`(不自動提交)、`OCI_COMMIT_ON_SUCCESS`。
  5. OCIFetch / `OCIFetchInto` 逐行取數。
  6. OCIFreeStatement、`OCILogoff` 釋放資源。

關鍵代碼範例

1. 基本查詢與結果處理

$conn = OCILogon('scott', 'tiger', 'ORCL');
$stmt = OCIParse($conn, 'SELECT empno, ename, sal FROM emp WHERE deptno = :dno');
OCIBindByName($stmt, ':dno', $deptno, 10);  // 綁定整數
$deptno = 20;
OCIExecute($stmt, OCI_DEFAULT);

while (OCIFetch($stmt)) {
    $empno = OCIResult($stmt, 'EMPNO');
    $ename = OCIResult($stmt, 'ENAME');
    $sal   = OCIResult($stmt, 'SAL');
    echo "$empno - $ename - $sal
"; } OCIFreeStatement($stmt); OCILogoff($conn);

2. LOB (CLOB/BLOB) 讀寫


$sql = "INSERT INTO docs (id, content) VALUES (doc_seq.NEXTVAL, EMPTY_CLOB()) RETURNING content INTO :clob";
$stmt = OCIParse($conn, $sql);
$clob = OCINewDescriptor($conn, OCI_D_LOB);
OCIBindByName($stmt, ':clob', $clob, -1, OCI_B_CLOB);
OCIExecute($stmt, OCI_DEFAULT);
$clob->save("大文本內容...");
$clob->free();


$stmt = OCIParse($conn, 'SELECT content FROM docs WHERE id = :id');
OCIBindByName($stmt, ':id', $id, 10);
$id = 1;
OCIExecute($stmt);
OCIFetch($stmt);
$clob = OCIResult($stmt, 'CONTENT');
echo $clob->load();  // 輸出完整文本
$clob->free();

3. 調用存儲過程(IN/OUT 參數)

$stmt = OCIParse($conn, "BEGIN pkg_hr.calc_bonus(:emp_id, :bonus_out); END;");
OCIBindByName($stmt, ':emp_id', $emp_id, 10);
OCIBindByName($stmt, ':bonus_out', $bonus, 10, OCI_B_NUM);  // 輸出參數
$emp_id = 1001;
OCIExecute($stmt);
echo "獎金: $bonus";

常用函數速查表

函數用途
OCILogon / OCIPLogon連接 / 持久連接
OCIParse解析 SQL/PLSQL
OCIBindByName綁定 PHP 變量到佔位符
OCIExecute執行語句
OCIFetch / OCIFetchInto取下一行 / 取行到數組
OCIResult獲取當前行指定列值
OCINewDescriptor創建 LOB/FILE/ROWID 描述符
OCIFreeStatement / OCILogoff釋放語句/連接資源
OCIError獲取最後錯誤信息

最佳實踐提醒

  • 生產環境**強制使用持久連接 (`OCIPLogon`)** 或連接池,減少握手開銷。
  • 所有用戶輸入**必須通過 `OCIBindByName` 綁定**,杜絕字符串拼接防注入。
  • LOB 操作後顯式調用 `->free()` 釋放臨時 LOB,避免 PGA 洩漏。
  • 異常處理:檢查 `OCIExecute` 返回值,失敗時調用 `OCIError` 記錄詳情。
  • 字符集:客戶端 `NLS_LANG` 與數據庫字符集一致(建議 `AL32UTF8`),避免亂碼與隱式轉換損失。

OCI8 是 PHP 連接 Oracle 最原生、功能最全的擴展,掌握其綁定機制與 LOB 處理,能構建高性能、安全的企業級 PHP 應用。

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