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

PHP Oracle OCI8 擴展函數參考:LOB 處理、預存程序綁定、環境變數設定與實戰範例

     編輯:PHP 相關知識

OCI8 擴展簡介

OCI8 為 PHP 存取 Oracle 8/8i/9i/10g/11g/12c/19c 的原生擴展,支援:

  • 全域/區域變數綁定佔位符 (:name)。
  • 完整 LOB (BLOB/CLOB/BFILE) 讀寫、ROWID 支援。
  • 使用者定義型別 (UDT)、集合型別。
  • 連線池 (oci_pconnect)、Statement Cache。

環境變數設定 (Apache/CLI 啟動前必須設定)

# Linux/Unix .bash_profile 或 Apache envvars
export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
export ORACLE_SID=ORCL
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8  # 字元集關鍵
export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
# Web 伺服器使用者 (www-data, apache) 需加入 oinstall/dba 群組

核心函數分類速查

分類代表函數
連線oci_connect, oci_pconnect, oci_close
解析/執行oci_parse, oci_execute, oci_fetch_array, oci_fetch_assoc
綁定變數oci_bind_by_name, oci_bind_array_by_name
LOB 操作oci_new_descriptor, OCILob->read, OCILob->write, OCILob->save, OCILob->load
交易控制oci_commit, oci_rollback, oci_set_prefetch
錯誤處理oci_error

範例 1:CLOB 寫入與讀取 (OCI_DEFAULT 延遲提交)

save("大量文字內容...");    // 寫入 LOB
oci_commit($conn);                 // 提交交易

// 讀取
$stmt2 = oci_parse($conn, "SELECT content FROM docs WHERE id = :id");
oci_bind_by_name($stmt2, ':id', $id);
oci_execute($stmt2);
$row = oci_fetch_assoc($stmt2);
if (is_object($row['CONTENT'])) $content = $row['CONTENT']->load();
echo $content;
?>

範例 2:呼叫預存程序 (IN/OUT 參數綁定)


常見問題與解決

問題原因解決
ORA-12154: TNS could not resolvetnsnames.ora 未設定、ORACLE_HOME 錯誤檢查 $ORACLE_HOME/network/admin/tnsnames.ora、EZCONNECT 字串
ORA-12705: Invalid NLS parameterNLS_LANG 未設定或不支援設定 NLS_LANG=AMERICAN_AMERICA.AL32UTF8
LOB 讀取回傳 Object 而非字串需呼叫 ->load() 或 ->read()if (is_object($lob)) $data = $lob->load();
預存程序 OUT 參數無值綁定長度不足、模式錯誤確認 oci_bind_by_name($sth, ':out', $var, 32) 長度足夠
中文亂碼資料庫/連接字元集不一致統一 AL32UTF8,NLS_LANG 設定正確

現代替代:PDO_OCI

$pdo = new PDO('oci:dbname=ORCL', 'scott', 'tiger');
$stmt = $pdo->prepare("SELECT * FROM emp WHERE deptno = :dno");
$stmt->execute([':dno' => 10]);
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { /* ... */ }

PDO_OCI 提供統一介面,但部分進階功能 (LOB 串流、陣列綁定) 仍需原生 OCI8。

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