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` 組。
OCILogon / OCIPLogon(持久連接)建立連接。OCIParse 解析 SQL/PLSQL。OCIBindByName 綁定 PHP 變量到佔位符(支持全局/局部變量、IN/OUT/INOUT)。OCIExecute 執行,模式:`OCI_DEFAULT`(不自動提交)、`OCI_COMMIT_ON_SUCCESS`。OCIFetch / `OCIFetchInto` 逐行取數。OCIFreeStatement、`OCILogoff` 釋放資源。$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);
$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();
$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 | 獲取最後錯誤信息 |
OCI8 是 PHP 連接 Oracle 最原生、功能最全的擴展,掌握其綁定機制與 LOB 處理,能構建高性能、安全的企業級 PHP 應用。