缺點:需 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
// 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 | 關閉連線 |
OCIBindByName 參數名稱包含冒號 :tnsnames.ora 設定、防火牆、Oracle Listener 狀態若需回傳結果集,可在預存程序中使用 SYS_REFCURSOR,PHP 端以 OCINewCursor() 接收並逐列讀取。