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

PHP 呼叫 Oracle 預存程序完整範例

     編輯:PHP 相關知識

為何使用預存程序?

  • 效能:減少 PHP 與資料庫往返次數,批次 SQL 操作在資料庫端一次完成
  • 速度:預存程序經編譯優化,執行速度優於動態 SQL
  • 安全:可封裝業務邏輯,避免 SQL Injection

缺點:需 DBA 與開發人員緊密配合,維護成本較高。

資料庫端建立測試環境

-- 建立測試表
CREATE TABLE TEST (
    ID   NUMBER(16) NOT NULL,
    NAME VARCHAR2(30) NOT NULL,
    PRIMARY KEY (ID)
);

INSERT INTO TEST VALUES (5, 'PHP_BOOK');

-- 建立預存程序:依 ID 查詢 NAME
CREATE OR REPLACE PROCEDURE PROC_TEST (
    p_id   IN OUT NUMBER,
    p_name OUT VARCHAR2
) AS
BEGIN
    SELECT NAME INTO p_name FROM TEST WHERE ID = p_id;
END PROC_TEST;
/

PHP 端呼叫程式碼 (OCI8 擴充)

<?php
// 1. 建立連線
$user     = "scott";
$password = "tiger";
$conn_str = "tnsname";  // tnsnames.ora 中定義的連線字串
$remote   = true;

if ($remote) {
    $conn = OCILogon($user, $password, $conn_str);
} else {
    $conn = OCILogon($user, $password);
}

// 2. 準備綁定變數
$id   = 5;
$name = "";

// 3. 預存程序呼叫語法:BEGIN 程序名(:參數1, :參數2); END;
$sql = "BEGIN PROC_TEST(:id, :name); END;";

// 4. 解析、綁定、執行
$stmt = OCIParse($conn, $sql);
OCIBindByName($stmt, ":id",   $id,   16);  // 長度 16 位
OCIBindByName($stmt, ":name", $name, 30); // 長度 30 位
OCIExecute($stmt);

// 5. 輸出結果
echo "Name is: $name<br>";

// 釋放資源
OCIFreeStatement($stmt);
OCILogoff($conn);
?>

關鍵函式說明

函式用途
OCILogon建立 Oracle 連線
OCIParse解析 SQL 陳述式
OCIBindByName將 PHP 變數綁定到 SQL 參數位置
OCIExecute執行已解析的陳述式
OCIFreeStatement釋放陳述式資源
OCILogoff關閉連線

常見錯誤與除錯

  • ORA-06550:檢查預存程序參數順序、型別是否一致
  • ORA-01008:變數未正確綁定,確認 OCIBindByName 參數名稱包含冒號 :
  • 連線失敗:確認 tnsnames.ora 設定、防火牆、Oracle Listener 狀態

進階:OUT 參數與 REF CURSOR

若需回傳結果集,可在預存程序中使用 SYS_REFCURSOR,PHP 端以 OCINewCursor() 接收並逐列讀取。

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