原文出處php
(這是來自「百度文庫」中的文章寫得很不錯)數據庫
PHP操做Oracle數據庫(OCI數據抽象層)
OCI(Oracle 8 Call-Interface)是PHP中內置的數據庫抽象層函數。
下面針對鏈接Oracle數據庫操做數據庫的常見任務舉例說明:
=======================基本查詢:無條件查詢===================
一、數據庫鏈接:函數: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"; } ?>
二、編譯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"); ?>
三、執行SQL語句:函數:oci_execute();
函數:bool oci_execute ( resource stmt [, int mode] )
說明: 函數返回布爾值,執行一條以前被解析過的語句
stmt:在第二步建立的編譯資源名
mode:容許定義執行模式,
OCI_COMMIT_ON_SUCCESS(默認):語句執行成功則自動提交
OCI_DEFAULT:自動創建一個事務,此事務會在鏈接關閉或者腳本結束自動回退,若是想提交,須要明確調用oci_commit() 提交事務,或者調用oci_rollback()回退事務session
<?php oci_execute($stmt,OCI_DEFAULT); ?>
四、提取查詢的結果:
函數: 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); ?>
五、釋放資源:
函數: bool oci_free_statement ( resource statement )
釋放關聯於語句或遊標的全部資源
bool oci_close ( resource connection )
關閉 Oracle數據庫鏈接fetch
<?php oci_free_statement($statement); oci_close($Oracle_conn); ?>
=======================基本查詢:有查詢條件的查詢===================
一、數據庫鏈接(略)
二、編譯SQL語句(略)
三、綁定變量及執行:
函數:bool oci_bind_by_name ( resource stmt, string ph_name, mixed &variable [, int maxlength [, int type]] )
將 PHP 變量 variable 綁定到 Oracle 的位置標誌符 ph_name。length 參數肯定該綁定的最大長度,若是要綁定一個
抽象數據類型,使用type參數url
<?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 ""; foreach($rows as $col_values){ echo $col_values; } } //釋放資源 oci_free_statement($statement); oci_close($Oracle_conn); ?>
=========================數據插入操做===================
=======================一、經過變量提供值======================
一、數據庫鏈接(略)
二、編譯SQL語句(略)
三、綁定變量及執行: spa
<?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); ?>
=======================二、經過數組提供值======================對象
<?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 "插入成功".""; } } oci_free_statement($statement); oci_close($Oracle_conn); ?>
=======================PHP調用存儲過程=========================
<?php //鏈接數據庫 $Oracle_conn=oci_connect("scott","tiger","hy"); /*定義調用語句(此處執行一個具備輸入參數和返回遊標的存儲過程) 存儲過程的代碼以下: create or replace procedure get_emp_inf (v_deptno in emp.deptno%type,v_res out sys_refcursor) is begin open v_res for select * from emp where deptno=v_deptno; end get_emp_inf; 存儲過程的調用語句的寫法有:begin...end和call兩種寫法 */ //分配並返回一個遊標句柄 $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"); /*定義調用語句(此處執行一個具備一個輸入參數的函數) 存儲函數的代碼以下: /* create or replace function chk_emp_exist (v_empno emp.empno%type) return int as v_num int; begin select count(rowid) into v_num from emp where empno=v_empno; if v_num<>0 then return 1; else return -1; end if; end; 存儲函數的調用語句的寫法有兩種寫法,第一種使用begin...end;,第二種能夠在一個select語句中調用,可是僅限於沒有輸出參數的 */ //建立調用語句 $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); ?>