PHP操作Oracle資料庫(OCI資料抽象層)
OCI(Oracle 8 Call-Interface)是PHP中內建的資料庫抽象層函數。
下面針對串連Oracle資料庫操作資料庫的常見任務舉例說明:
=======================基本查詢:無條件查詢===================
1、資料庫連接:函數:oci_connect()
函數:resource oci_connect ( string username, string password [, string db [, string charset [, int session_mode]]] )
說明: 函數的傳回值為資源
username、password:是Oracle的使用者名稱密碼,即方案名及密碼
db:是選擇性參數,如果使用本地的Oracle執行個體或者使用tnsnames.ora設定檔中註冊的本地服務名,直接提供其名稱即可。
如果此參數留空,則使用本地的ORACLE_SID或者搜尋tnsnames.ora檔案的註冊的預設本地服務名。
charset:參數是在Oracle9.2以上的版本使用的參數,預設可以留空,使用NLS_LANG 環境變數替代。
session_mode:用於設定使用特權身份登入(預設禁用),預設有3個選項:OCI_DEFAULT,OCI_SYSOPER 和 OCI_SYSDBA
範例:串連本機註冊的本地服務名為hy的Oracle執行個體,使用者名稱/密碼為scott/tiger
<?php
//建立串連
$conn=oci_connect("scott","tiger","hy");
//檢查串連是否成功
if($conn){
echo "connect success";
}
else{
echo "connect error";
}
?>
2、編譯SQL語句:函數:oci_parse()
函數:resource oci_parse ( resource connection, string query )
說明: 函數傳回值為資源,編譯以字串形式提供的SQL語句
connection:為在第一步中建立的連結資源標識符
query:是一個查詢字串,用雙引號引起來。
在 connection 上配置 query 並返回語句標識符以用於 oci_bind_by_name(),oci_execute() 以及其它函數
<?php
$stmt=oci_parse($conn,"select * from emp");
?>
3、執行SQL語句:函數:oci_execute();
函數:bool oci_execute ( resource stmt [, int mode] )
說明: 函數返回布爾值,執行一條之前被解析過的語句
stmt:在第二步建立的編譯資源名
mode:允許定義執行模式,
OCI_COMMIT_ON_SUCCESS(預設):語句執行成功則自動認可
OCI_DEFAULT:自動建立一個事務,此事務會在串連關閉或者指令碼結束自動回退,如果想提交,需要
明確調用oci_commit() 提交事務,或者調用oci_rollback()回退事務
<?php
oci_execute($stmt,OCI_DEFAULT);
?>
4、提取查詢的結果:
函數: int oci_fetch_all ( resource statement, array &output [, int skip [, int maxrows [, int flags]]] )
提取所有的結果資料到數組(返回擷取資料的行數)
array oci_fetch_array ( resource statement [, int mode] )
提取結果資料的一行到一個關聯陣列(OCI_ASSOC)或者數字索引數組(OCI_NUM )或兩者(OCI_BOTH)等
array oci_fetch_assoc ( resource statement )
提取結果資料的一行到一個關聯陣列
object oci_fetch_object ( resource statement )
提取結果資料的一行到一個對象
array oci_fetch_row ( resource statement )
提取結果資料的一行到一個數字索引數組
<?php
$result=oci_fetch_assoc($stmt);
print_r($result);
?>
5、釋放資源:
函數: bool oci_free_statement ( resource statement )
釋放關聯於語句或遊標的所有資源
bool oci_close ( resource connection )
關閉 Oracle資料庫連接
<?php
oci_free_statement($statement);
oci_close($Oracle_conn);
<?
=======================基本查詢:有查詢條件的查詢===================
1、資料庫連接(略)
2、編譯SQL語句(略)
3、綁定變數及執行:
函數:bool oci_bind_by_name ( resource stmt, string ph_name, mixed &variable [, int maxlength [, int type]] )
將 PHP 變數 variable 綁定到 Oracle 的位置標誌符 ph_name。length 參數確定該綁定的最大長度,如果要綁定一個
抽象資料類型,使用type參數
<?php
$Oracle_conn=oci_connect("scott","tiger","hy");
$query="select * from emp where job=upper(:job) and deptno=upper(:deptno)";
$statement=oci_parse($Oracle_conn,$query);
//設定綁定變數的取值
$job="CLERK";
$deptno=10;
oci_bind_by_name($statement,":job",$job);
oci_bind_by_name($statement,":deptno",$deptno);
//執行語句
oci_execute($statement);
//取得結果資料
oci_fetch_all($statement,$result);
foreach($result as $rows){
echo "<br>";
foreach($rows as $col_values){
echo $col_values;
}
}
//釋放資源
oci_free_statement($statement);
oci_close($Oracle_conn);
?>
=======================資料插入操作===================
=======================1、通過變數提供值======================
1、資料庫連接(略)
2、編譯SQL語句(略)
3、綁定變數及執行:
<?php
$Oracle_conn=oci_connect("scott","tiger","hy");
$query="insert into emps(empno,ename,sal,hiredate) values(:empno,:ename,:sal,:hiredate)";
$statement=oci_parse($Oracle_conn,$query);
//===============設定綁定變數的取值(通過變數提供值)================
$empno=1203;
$ename='TEST';
$sal=1500;
$hiredate='03-12月-81';//如果是使用Oracle資料庫伺服器時間,則在DML語句中直接提供sysdate
oci_bind_by_name($statement,":empno",$empno);
oci_bind_by_name($statement,":ename",$ename);
oci_bind_by_name($statement,":sal",$sal);
oci_bind_by_name($statement,":hiredate",$hiredate);
//執行語句,設定執行模式為自動認可
oci_execute($statement,OCI_COMMIT_ON_SUCCESS);
//檢查影響的行數
if(oci_num_rows){
echo "插入成功";
}
//釋放資源
oci_free_statement($statement);
oci_close($Oracle_conn);
?>
=======================2、通過數組提供值======================
<?php
$Oracle_conn=oci_connect("scott","tiger","hy");
$query="insert into emps(empno,ename) values(:empno,:ename)";
$statement=oci_parse($Oracle_conn,$query);
//===============設定綁定變數的取值(通過數組提供值)================
$data=array(
1884=>"a",
1885=>"b",
1886=>"c");
oci_bind_by_name($statement,":empno",$empno,32);
oci_bind_by_name($statement,":ename",$ename,32);
foreach ($data as $empno => $ename) {
if(oci_execute($statement)){
echo "插入成功"."<br>";
}
}
oci_free_statement($statement);
oci_close($Oracle_conn);
?>
PHP操作Oracle資料庫(OCI資料抽象層)(二)
=======================PHP調用預存程序=========================
<?php
//串連資料庫
$Oracle_conn=oci_connect("scott","tiger","hy");
//分配並返回一個遊標控制代碼
$cur=oci_new_cursor($Oracle_conn);
//建立調用語句
$query="call get_emp_inf(:deptno,:v_cur)";
$statement=oci_parse($Oracle_conn,$query);
//提供輸入參數
$deptno=10;
//綁定遊標控制代碼,接收返回的遊標參數
oci_bind_by_name($statement,":deptno",$deptno,16);
oci_bind_by_name($statement,":v_cur",$cur,-1,OCI_B_CURSOR);
//執行
oci_execute($statement);
//擷取返回的遊標資料到遊標控制代碼
oci_execute($cur);
//遍曆遊標內容
while ($dat = oci_fetch_row($cur)) {
var_dump($dat);
}
oci_free_statement($statement);
oci_close($Oracle_conn);
?>
=======================PHP調用儲存函數=========================
<?php
//串連資料庫
$Oracle_conn=oci_connect("scott","tiger","hy");
//建立調用語句
$query="begin :res:=chk_emp_exist(:empno); end;";
$statement=oci_parse($Oracle_conn,$query);
//提供輸入參數
$empno=10;
$res=-100;//傳回值可能出現負值,所以初始化時用負值
//綁定變數,接收返回的參數
oci_bind_by_name($statement,":res",$res);
oci_bind_by_name($statement,":empno",$empno);
//執行
oci_execute($statement);
//判斷是否存在
if($res==1){
echo "此員工存在";
}
else{
echo "此員工不存在";
}
oci_free_statement($statement);
oci_close($Oracle_conn);
?>