PHP操作Oracle數據庫


原文出處

(這是來自“百度文庫”中的文章寫得很不錯)

 
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 "";
    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 "插入成功"."";
        }
}
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);                
        ?>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM