您好,UncleToo欢迎您!  为了更好的浏览本站,请使用高版本浏览器
RSS  Tag     设为首页 | 加入收藏
 您所在的位置:首页 > PHP框架 > ThinkPHP

ThinkPHP执行Oracle存储过程

作者:UncleToo  来源:互联网  日期:2013-09-02 10:43:20
收藏  评论:( 0 )  阅读:1092

用了很久的TP+Oracle来开发,之前就发现了ThinkPHP不能解决执行Oracle存储过程的问题,但是一般我们很多时候都会用到Oracle存储过程。特分享之前写的一个临时解决方法,可能有些地方不足,请大家可以不吝提出,并建议TP官方早日对Oracle存储过程有一个好的支持。
一、首先修改ThinkPHP3.0的Oracle驱动(ThinkPHP\Lib\Driver\Db\DbOracle.class.php),在DbOracle类中增加以下方法:

/**
    +----------------------------------------------------------
    * 执行存儲過程
    +----------------------------------------------------------
    * @access public add by hongping at 2012.06.26
    +----------------------------------------------------------
    * @param  string $pubName  存储过程名称
    +----------------------------------------------------------
    * @param  array  $valueArr 传入传出参数,必須与存储过程定义参数顺序一致,如传出参数则为false
    +----------------------------------------------------------
    * @throws ThinkExecption
    +----------------------------------------------------------
    */
    public function execpub($pubName,$valueArr) {              
       $this->initConnect(true);
       if ( !$this->_linkID ) return false;
       //更改事务模式
       $this->mode = OCI_COMMIT_ON_SUCCESS;
       //释放前次的查询结果
       if ( $this->queryID ) $this->free();
       N('db_write',1);
       // 记录开始执行时间
       G('queryStartTime');       
       $argSql = "Select ARGUMENT_NAME,IN_OUT FROM USER_ARGUMENTS Where OBJECT_NAME = '".strtoupper($pubName)."' orDER BY SEQUENCE";       
       $argRow = $this->query($argSql);
       $pubParm = array();
       $ParStr = '';         
       foreach($argRow as $key=>$value){
               $ParStr .= ",:".$value['argument_name'];
               $pubParm[] = $value['argument_name'].','.$value['in_out'];
       }       
       $ParStr = substr($ParStr,1);
       $BindArr = array_combine($pubParm,$valueArr);
       $this->queryID = oci_parse($this->_linkID, 'BEGIN '.$pubName.'('.$ParStr.');END;');
       foreach($BindArr as $key=>$value){
         $EIO = explode(',',$key);
         $EParm = strtolower($EIO[0]);/*Param*/
         $IO = strtolower($EIO[1]);/*IN OUT TYPE{IN/OUT/IN_OUT}}*/
         if($IO==='out'){
           oci_bind_by_name($this->queryID, ":".$EParm, $OutData[$EParm],2048);
         }else{
        $OutData[$EParm] = $value;
           oci_bind_by_name($this->queryID, ":".$EParm, $OutData[$EParm],2048);
         }
       }        
       oci_execute($this->queryID);            
       $this->debug();
       if (!$this->queryID) {
           $this->error();
           return $this->queryID;
       }else {
           return $OutData;
       }
   }

二、然后在ThinkPHP\Lib\Core\Model.class.php加入以下(1185行左右):

/**
     +----------------------------------------------------------
     * 执行oracle存儲過程
     +----------------------------------------------------------
     * @access public
     +----------------------------------------------------------
     * @param string  $sql    SQL指令
     * @param array   $parr   传入传出参数值
     * @param boolean $parse  是否需要解析SQL
     +----------------------------------------------------------
     * @return false | integer
     +----------------------------------------------------------
     */
    public function execpub($sql,$parr,$parse=false) {
        $sql  =   $this->parseSql($sql,$parse);
        return $this->db->execpub($sql,$parr);
    }

使用示例:

public function testPub(){
         $testModel = M();        
         $data1 =  $_POST['data1'];
         $data2 =  $_POST['data2'];    
                         
         if($data1!='' && $data2!=''){
            $pubParm = array($data1,$data2,false); //这边的传入参数顺序与存储过程里面定义的参数一致。
            $pubName = "PUB_CHECK_SN_KT";/*存儲過程名字*/
            $result = $testModel ->execpub($pubName,$pubParm);
         }
         $this->success($result['res']);
    }




除非特别声明,本站所有PHP教程及其他教程/文章均为原创、翻译或网友投稿,版权均归UncleToo中文网所有, 转载请注明作者及出处。
原文网址:http://www.uncletoo.com/html/think/369.html
读完这篇文章后,你是否有所收获? 分享是一种生活的信念!
  • 0
  • 0
我来说两句
更多>>网友评论