ThinkPHP+Oracle执行存储过程

来源:互联网 发布:软件开发知识库 编辑:程序博客网 时间:2024/05/22 09:57
ThinkPHP+Oracle执行存储过程。

一、首先修改ThinkPHP3.0的Oracle驱动(ThinkPHP\Lib\Driver\Db\DbOracle.class.php),在DbOracle类中增加以下方法:

  • /**
  •      +----------------------------------------------------------
  •      * 执行存储过程
  •      +----------------------------------------------------------
  •      * @author   hongping <hongping626@qq.com>
  •      +----------------------------------------------------------
  •      * @param  string $pName  存储过程名称  
  •      * @param  array  $pValue 传入参数值
  •      +----------------------------------------------------------
  •      * @return array  返回执行结果
  •      +----------------------------------------------------------
  •      */
  •      public function execProcedure($pName,$pValue) {
  •         $pValue = array_change_key_case($pValue, CASE_LOWER);//强制下标为小写
  •         $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($pName)."' ORDER BY SEQUENCE";        
  •         $argRow = $this->query($argSql);
  •         $ParStr = '';
  •         $x = 0;   
  •         foreach($argRow as $key=>$value){
  •                 if($x==0){
  •                     $ParStr .= ":".$value['argument_name'];                    
  •                 }else{
  •                     $ParStr .= ",:".$value['argument_name'];                    
  •                 }
  •                 $x++;
  •         }
  •         $this->queryID = oci_parse($this->_linkID, 'BEGIN '.$pName.'('.$ParStr.');END;');
  •         foreach($argRow as $key=>$value){
  •           $parmName = strtolower($value['argument_name']);
  •           $parmType = strtolower($value['in_out']);
  •           if($parmType==='out'){
  •             oci_bind_by_name($this->queryID, ":".$parmName, $OutData[$parmName],2048);
  •           }else{
  •             $OutData[$parmName] = $pValue[$parmName];
  •             oci_bind_by_name($this->queryID, ":".$parmName, $OutData[$parmName],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行左右):

    1. /** 
    2.      +---------------------------------------------------------- 
    3.      * 执行oracle存儲過程 
    4.      +---------------------------------------------------------- 
    5.      * @access public 
    6.      +---------------------------------------------------------- 
    7.      * @param string  $sql    SQL指令 
    8.      * @param array   $parr   传入传出参数值 
    9.      * @param boolean $parse  是否需要解析SQL 
    10.      +---------------------------------------------------------- 
    11.      * @return false | integer 
    12.      +---------------------------------------------------------- 
    13.      */  
    14.     public function execProcedure($sql,$parr,$parse=false) {  
    15.         $sql  =   $this->parseSql($sql,$parse);  
    16.         return $this->db->execProcedure($sql,$parr);  
    17.     } 
    使用示例:

    1. public function testPub(){            
    2.          $data['name'] =  $_POST['name']; //存储过程传入参数
    3.          $data['value'] =   $_POST['value']; //存储过程传入参数
    4.            
    5.          $pdName = "PUB_TEST_KT";/*存储过程名*/  
    6.          $result =M() ->execProcedure($pubName,$pubParm);//执行
    7.          $this->success($result['res']);//返回结果


  • 0 0
    原创粉丝点击