Oricle 数据库操作类

Oricle 数据库操作类

define('OCI_RETURN_ALLS',OCI_BOTH + OCI_RETURN_LOBS);

class Oracle {
 /**
  * select方法返回的最大记录数
  */
 const MAX_ROW_NUM = 1000;

 /**
  * 数据查询结果集对象
  * @var object $dataSet
  */
 public $dataSet   = NULL ;

 /**
  * 数据源对象
  * @var object $ds
  */
 public $ds    = NULL ;

 /**
  * 查询的SQL语句
  * @var string $sql
  */
 public $sql    = '' ;
 
 /**
  * 执行查询的模式,值为 OCI_COMMIT_ON_SUCCESS 或 OCI_DEFAULT
  * @var string $excuteMode
  */
 public $executeMode = OCI_COMMIT_ON_SUCCESS ;

 /**
  * 构造函数
  * @param object $ds 数据库
  * @param string $sql 要初始化查询的SQL语句
  */
 function __construct($ds=NULL , $sql=NULL) {
  if (!$ds) {
   $this->error(DbException::DB_UNCONNECTED, '数据库还

未连接。');
  } else {
   $this->ds = $ds;
   if ($sql) {
    $this->open($sql);
   }
  }
 }
 
 /**
  * 释放所占用的内存
  * @param object $dataSet 需要释放资源的结果集
  * @access public
  */
 public function close($dataSet=NULL) {
  if ($dataSet) {
   @oci_free_statement($dataSet);
  } else {
   @oci_free_statement($this->dataSet);
   $this->eof = false ;
   $this->recordCount = 0 ;
   $this->recNo = -1 ;
  }
 }
 
 /**
  * 对$pass进行数据库加密,返回加密之后的值
  * @param string $pass 要加密的字符串
  * @return string
  * @access public
  */
 public function encodePassword($pass) {
  return md5($pass);
 }
 
 /**
  * 得到错误信息和错误代号
  * @param integer $queryResult 查询结果
  * @return array
  * @access protected
  */
 protected function errorInfo($queryResult = NULL) {
  $result = oci_error($this->ds->connect);
  return $result;
 }
 
 /**
  * 错误信息处理
  * @param string $errorId 错误ID
  * @param string $errorMessage 错误信息
  * @access protected
  */
 protected function error($errorId, $errorMessage) {
  throw new DbException($errorMessage, $errorId);
 }
 
 /**
  * 执行SQL语句
  * @param string $sql SQL语句
  * @return object
  * @param int $rowFrom 启始行号,行号从1开始
  * @param int $rowTo 结束行号,值为0表示
  * @access public
  * @see DbQuery::open
  */
 public function execute($sql = '', $rowFrom = 0, $rowTo =

self::MAX_ROW_NUM) {
  if ($rowFrom != 0 || $rowTo != self::MAX_ROW_NUM) {
   $sql = 'select * from (select row_.*, rownum rownum_

from ('
     . $sql . ') row_ where rownum <= '
     . $rowTo . ') where rownum_ >= ' .

$rowFrom;
  }
  //echo $sql . '<br>';
  //$start = microtime(true);
  $dataSet = @oci_parse($this->ds->connect, $sql);
  $executeSucceed = @oci_execute($dataSet, $this-

>executeMode);
  //echo 'sql:'. ((string)(microtime(true)-$start)) . '<br>';
  if (!$dataSet || !$executeSucceed) {
   $sqlError = $this->errorInfo();
   $errorMessage = '执行[<b><font color="#FF0000">' .

$sql
     . '</font></b>]出错!<br> <font

color=#FF0000> ['
     . $sqlError['code'] . ']: '
     . $sqlError['message'] . '</font>' ;
   $this->error(DbException::DB_QUERY_ERROR,

$errorMessage);
  }
  return $dataSet;
 }
 
 /**
  * 执行SQL语句,结果集保存到属性$dataSet中
  * @param string $sql SQL语句
  * @param int $rowFrom 启始行号,行号从1开始
  * @param int $rowTo 结束行号,值为0表示
  * @return object
  * @access public
  * @see DbQuery::execute
  */
 public function open($sql='', $rowFrom = 0, $rowTo =

self::MAX_ROW_NUM) {
  $this->dataSet = $this->execute($sql, $rowFrom, $rowTo);
  $this->sql = $sql ;
  return $this->dataSet;
 }

 /**
  * 将一行的各字段值拆分到一个数组中
  * @param object $dataSet 结果集
  * @param integer $resultType 返回类型,OCI_ASSOC、OCI_NUM 或

OCI_BOTH
  * @return array
  */
 public function fetchRecord($dataSet=NULL, $resultType=OCI_BOTH) {
  $result = @oci_fetch_array(($dataSet) ? $dataSet : $this-

>dataSet, $resultType);
  if (is_array($result)) {
   foreach ($result as $key => $value) {
    if (!is_numeric($key)) {
     $result[strtolower($key)] = $value;
    }
   }
  }
  return $result;
 }

 public function snext() {
  $result = @oci_fetch_array($this->dataSet, OCI_BOTH);
  return $result;
 }
 /**
  * 取得字段数量
  * @param object $dataSet 结果集
  * @return integer
  */
 public function getFieldCount($dataSet = NULL) {
  return oci_num_fields(($dataSet) ? $dataSet : $this-

>dataSet);
 }
 
 /**
  * 取得下一条记录。返回记录号,如果到了记录尾,则返回FALSE
  * @return integer
  * @access public
  * @see getPrior()
  */
 public function next() {
  return $this->fetchRecord();
 }
 
 /**
  * 得到当前数据库时间,格式为:yyyy-mm-dd hh:mm:ss
  * @return string
  * @access public
  */
 public function getNow() {
  return $this->getValue('SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD

HH24:MI:SS') dateOfNow FROM DUAL');
 }
 
 /**
  * 根据SQL语句从数据表中取数据,只取第一条记录的值,
  * 如果记录中只有一个字段,则只返回字段值。
  * 未找到返回 FALSE
  *
  * @param string $sql SQL语句
  * @return array
  * @access public
  */
 public function getValue($sql = '', $hasClob = false) {
  $dataSet = $this->execute($sql, 1, 1);
  if ($hasClob) {
   $returnType = OCI_RETURN_ALLS;
  } else {
   $returnType = OCI_BOTH;
  }
  if ($result = $this->fetchRecord($dataSet,$returnType)) {
   $fieldCount = $this->getFieldCount($dataSet);
   $this->close($dataSet);
   return ($fieldCount<=2) ? $result[0] : $result;
  } else {
   return false ;
  }
 }

 public function getSeq($seqName = '') {
  $dataSet = $this->execute('SELECT '.$seqName.'.nextval from

sys.dual');
  if ($result = $this->fetchRecord($dataSet)) {
   $fieldCount = $this->getFieldCount($dataSet);
   $this->close($dataSet);
   return ($fieldCount<=2) ? $result[0] : $result;
  } else {
   return false ;
  }
 }
 /**
  * 表是否存在,返回true
  * @param string $tableName 要查询的表名
  * @return bool
  * @access public
  */
 public function tableIsExists($tableName) {
  return false;
 }
 
 /**
  * 开始事务
  * @access public
  */
 public function begin() {
  $this->executeMode = OCI_DEFAULT;
 }
 
 /**
  * 提交事务
  * @access public
  */
 public function commit() {
  oci_commit($this->ds->connect);
  $this->executeMode = OCI_COMMIT_ON_SUCCESS;
 }
 
 /**
  * 回滚事务
  * @access public
  */
 public function rollback() {
  oci_rollback($this->ds->connect);
  $this->executeMode = OCI_COMMIT_ON_SUCCESS;
 }
 
 /**
  * 插入一条记录
  * @param string $tableName 表名
  * @param array $fieldArray 字段数组
  * @param string $whereForUnique 唯一性条件
  * @return int
  * @access public
  */
 public function insert($tableName, $fieldArray, $whereForUnique =

NULL, $clobField = NULL ) {
  if (!$tableName || !$fieldArray || !is_array($fieldArray)) {
   throw new Exception('参数 $tableName 或 $fieldArray

的值不合法!');
  }
  if ($whereForUnique) {
   $where = ' WHERE ' . $whereForUnique;
   $isExisted = $this->getValue('SELECT COUNT(*) FROM '

. $tableName . $where);
   if ($isExisted) {
    throw new DbException('记录已经存在!',

DbException::DB_RECORD_IS_EXISTED);
   }
  }
  $fieldNameList = array();
  $fieldValueList = array();
  foreach ($fieldArray as $fieldName => $fieldValue) {
   if (!is_int($fieldName)) {
    $fieldNameList[] = $fieldName;
    if ($clobField && $clobField==$fieldName) {
     $fieldValueList[] = 'EMPTY_CLOB()';
     $hasClob = true;
     $clobStr = str_replace

("''","'",$fieldValue);
    } else {
     $fieldValueList[] = ''' .

$fieldValue . ''';
    }
   }
  }
  $fieldName = implode(',', $fieldNameList);
  $fieldValue = implode(',', $fieldValueList);
  $sql = 'INSERT INTO ' . $tableName . '('
     . $fieldName . ') VALUES (' .

$fieldValue . ')';
  if ($hasClob) {
   $sql .= ' RETURNING content INTO :clob_string';
   $dataSet = oci_parse($this->ds->connect, $sql);
   $clob = oci_new_descriptor($this->ds->connect,

OCI_D_LOB);
   oci_bind_by_name($dataSet, ':clob_string', $clob, -

1, OCI_B_CLOB);
   oci_execute($dataSet, OCI_DEFAULT);
   $clob->save($clobStr);
   oci_commit($this->ds->connect);
   return $dataSet;
  } else {
   return $this->execute($sql);
  }
 }
 
 /**
  * 更新一条记录
  * @param string $tableName 表名
  * @param array $fieldArray 字段数组
  * @param string $whereForUpdate 查询条件
  * @param string $whereForUnique 唯一性条件
  * @return int
  * @access public
  */
 public function update($tableName, $fieldArray,

$whereForUpdate=NULL, $whereForUnique=NULL, $clobField = NULL) {
  if (!$tableName || !$fieldArray || !is_array($fieldArray)) {
   throw new Exception('参数 $tableName 或 $fieldArray

的值不合法!');
  }
  if ($whereForUnique) {
   $where = ' WHERE ' . $whereForUnique;
   $isExisted = $this->getValue('SELECT COUNT(*) FROM '

. $tableName . $where);
   if ($isExisted) {
    throw new DbException('记录已经存在!',

DbException::DB_RECORD_IS_EXISTED);
   }
  }
  $fieldNameValueList = array();
  foreach ($fieldArray as $fieldName => $fieldValue) {
   if (!is_int($fieldName)) {
    if ($clobField && $clobField==$fieldName) {
     $fieldNameValueList[] = $fieldName .

'=EMPTY_CLOB()';
     $hasClob = true;
     $clobStr = str_replace

("''","'",$fieldValue);
    } else {
     $fieldNameValueList[] = $fieldName .

'='' . $fieldValue . ''';
    }
   }
  }
  $fieldNameValue = implode(',', $fieldNameValueList);
  if ($whereForUpdate) {
   $whereForUpdate = ' WHERE ' . $whereForUpdate;
  }
  $sql = 'UPDATE ' . $tableName
    . ' SET ' . $fieldNameValue .

$whereForUpdate;
  if ($hasClob) {
   $sql .= ' RETURNING content INTO :clob_string';
   $dataSet = oci_parse($this->ds->connect, $sql);
   $clob = oci_new_descriptor($this->ds->connect,

OCI_D_LOB);
   oci_bind_by_name($dataSet, ':clob_string', $clob, -

1, OCI_B_CLOB);
   oci_execute($dataSet, OCI_DEFAULT);
   $clob->save($clobStr);
   oci_commit($this->ds->connect);
   return $dataSet;
  } else {
   return $this->execute($sql);
  }
 }
 
 /**
  * 选择一条记录
  * @param string $sql sql语句
  * @param string $dataFormat 返回数据格式, 值

有"array","hashmap","hashmap_str","dataset"
  * @param int $rowFrom 启始行号,行号从1开始
  * @param int $rowTo 结束行号,值为0表示
  * @result array
  * @access public
  */
 public function select($sql, $dataFormat = 'array', $rowFrom = 0,

$rowTo = self::MAX_ROW_NUM, $hasClob = false) {
  $dataSet = $this->execute($sql, $rowFrom, $rowTo);
  switch ($dataFormat) {
  case 'array': //数组
   $result = array();
   $isMultiField = ($this->getFieldCount($dataSet) >

1);
   $i = 0;
   if ($hasClob) {
    $returnType = OCI_RETURN_ALLS;
   } else {
    $returnType = OCI_BOTH;
   }
   while ($data = $this->fetchRecord

($dataSet,$returnType)) {
    $result[$i] = ($isMultiField) ? $data :

$data[0];
    $i++;
   }
   $this->close($dataSet);
   break;

  case 'hashmap': //散列表
   $result = array();
   while ($data = $this->fetchRecord($dataSet)) {
    $result[ $data[0] ] = $data[1];
   }
   $this->close($dataSet);
   break;

  case 'hashmap_str': //散列表字符串
   $result = array();
   while ($data = $this->fetchRecord($dataSet,

OCI_NUM)) {
    $result[] = $data[0] . '=' . $data[1];
   }
   $result = implode('|', $result);
   $this->close($dataSet);
   break;

  default: //dataset 数据集,当返回数据格式为数据集时,select

方法的功能与execute方法相同
   $result = $dataSet;
  }
  return $result;
 }
 
 /**
  * 返回最大值
  * @param string $tableName 表名
  * @param string $idField 字段名
  * @param string $where 查询条件
  * @return int
  * @access public
  */
 public function getMax($tableName, $idField, $where = NULL) {
  $where = ($where) ? (' WHERE ' . $where) : '';
  return $this->getValue('SELECT MAX(' . $idField . ') FROM '

. $tableName . $where);
 }
}

时间: 2024-10-01 21:03:23

Oricle 数据库操作类的相关文章

PHP实现的一个简单的数据库操作类

PHP实现的一个简单的数据库操作类 实现的功能: - 在实例化的时候能设置连接字符集 - 在实例化的时候能连接数据库 - 在实例化的时候能选择默认数据库 - 销毁对象时关闭数据库 代码如下: <?php // 数据库操作类MySQLDB class MySQLDB { // 声明属性 private $server; private $username; private $password; public $default_db; public $link; // 声明构造函数 public f

[原创] EasyASP v1.5简化ASP开发,包含数据库操作类

EasyASP v1.5简化ASP开发,包含数据库操作类 EasyASP是一个方便快速开发ASP的类,其中包含了一个数据库控制类(原clsDbCtrl.asp,对原代码作了优化和修改,包含对数据库的各类操作及存储过程的调用,全部封装在Easp.db中,使用起来会更方便,调用也更简单).而Easp类中提供了大量实用的ASP通用过程及方法,可以简化大部分的ASP操作.目前只提供了VBScript版,JScript版将来可能会提供.详细说明请下载帮助手册,里面有非常详细的使用方法说明及源码范例. 源码

ASP通用数据库操作类源代码

<%'=========================================================================='文件名称:clsDbCtrl.asp'功 能:数据库操作类'作 者:coldstone (coldstone[在]qq.com)'程序版本:v1.0.5'完成时间:2005.09.23'修改时间:2007.10.30'版权声明:可以在任意作品中使用本程序代码,但请保留此版权信息.'          如果你修改了程序中的代码并得到更好的应用,

Access数据库操作类

Access数据库操作类AccessHelper using System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControl

一个简单的asp数据库操作类

数据|数据库 <%'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%'数据库操作类'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%'名称:Class_DBOperate'版本:0.2'作者:qihangnet'更新:2005年6月14日'作用:简化数据库操作的流程'授权:免费使用'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Class Class_DBOperate '************************

一个基于PDO的数据库操作类(新) 一个PDO事务实例

复制代码 代码如下: <?php /* * 作者:胡睿 * 日期:2011/03/19 * 电邮:hooray0905@foxmail.com * * 20110319 * 常用数据库操作,如:增删改查,获取单条记录.多条记录,返回最新一条插入记录id,返回操作记录行数等 * 20110630 * 整体修改方法,合并部分参数 * 规范代码,一个方法里只有1个return语句 */ /* 参数说明 int $debug 是否开启调试,开启则输出sql语句 int $mode 0 返回数组 1 返回

一个基于PDO的数据库操作类

百度之后决定使用PDO,至于为什么选择PDO,这里就不再多说,大家自己去百度下就能明白. 既然要换,那最基本就需要有个常用的数据库操作类,也就是所谓的增删改查等,昨晚捣腾了一晚,大致弄出了个雏形,以下就是代码,希望大家能给出点意见. 复制代码 代码如下: <?php /* 作者:胡睿 日期:2011/03/19 电邮:hooray0905@foxmail.com 20110319 常用数据库操作,如:增删改查,获取单条记录.多条记录,返回最新一条插入记录id,返回操作记录行数等 */ /* 参数

简单快速有趣的MySQL数据库操作类:SimpleDB

mysql|数据|数据库 自己写着玩的,代码没有测试,不过觉得思路不错,如果能够加上部分异常处理的功能,应该比较帅了,支持PHP4/PHP5,恩,虽然没有ADOdb或者PEAR::DB强,不错一般应用应该不错,恩. 喜欢的就自己拿去用吧,自己随便改,呵呵,也欢迎提意见.(注释遵循PHPDoc的标准,便于生成手册)  注意:代码未经测试,出现问题可要自己负责哇,呵呵.         <?//==========================================// 文件: Simp

ASP.NET[C#]的ACCESS数据库操作类

access|asp.net|数据|数据库 ASP.NET[C#]的ACCESS数据库操作类       //网上很多都是操作SQL SER 的,整理了一下,不是很完善,但不影响使用,呵呵--       //private string datapatch = ConfigurationSettings.AppSettings["acessconn"];//数据库地址                                            private string