zoukankan      html  css  js  c++  java
  • 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);                
            ?>
    
  • 相关阅读:
    与我十年长跑的女朋友就要嫁人了
    与我十年长跑的女朋友就要嫁人了
    面试技巧
    面试技巧
    [转载]axis2通过wsdl生成客户端程序并本地调用
    [转载]axis2通过wsdl生成客户端程序并本地调用
    generator自动生成mybatis配置和类信息
    generator自动生成mybatis配置和类信息
    [转载]整合struts2、Spring3实现web快速开发
    [转载]整合struts2、Spring3实现web快速开发
  • 原文地址:https://www.cnblogs.com/quixon/p/4685407.html
Copyright © 2011-2022 走看看