⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 oci.php

📁 Piwik#Opensourcewebanalytics一款可以和GOOGLE媲美的开源统计系统,运用AJAX.功能强大.无色提示:按照需要PHP5.1以上和MySQL数据库支持。
💻 PHP
字号:
<?php/** * Zend Framework * * LICENSE * * This source file is subject to the new BSD license that is bundled * with this package in the file LICENSE.txt. * It is also available through the world-wide-web at this URL: * http://framework.zend.com/license/new-bsd * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to license@zend.com so we can send you a copy immediately. * * @category   Zend * @package    Zend_Db * @subpackage Adapter * @copyright  Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com) * @license    http://framework.zend.com/license/new-bsd     New BSD License *//** * Zend_Db_Adapter_Pdo */require_once 'Zend/Db/Adapter/Pdo/Abstract.php';/** * Zend_Db_Adapter_Exception */require_once 'Zend/Db/Adapter/Exception.php';/** * Class for connecting to Oracle databases and performing common operations. * * @category   Zend * @package    Zend_Db * @subpackage Adapter * @copyright  Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com) * @license    http://framework.zend.com/license/new-bsd     New BSD License */class Zend_Db_Adapter_Pdo_Oci extends Zend_Db_Adapter_Pdo_Abstract{    /**     * PDO type.     *     * @var string     */    protected $_pdoType = 'oci';    /**     * Creates a PDO DSN for the adapter from $this->_config settings.     *     * @return string     */    protected function _dsn()    {        // baseline of DSN parts        $dsn = $this->_config;        $tns = 'dbname=';        if (isset($dsn['host'])) {            $tns .= '//' . $dsn['host'];            if (isset($dsn['port'])) {                $tns .= ':' . $dsn['port'];            }            $tns .= '/';        }        $tns .= $dsn['dbname'];        return $this->_pdoType . ':' . $tns;    }    /**     * Quote a raw string.     * Most PDO drivers have an implementation for the quote() method,     * but the Oracle OCI driver must use the same implementation as the     * Zend_Db_Adapter_Abstract class.     *     * @param string $value     Raw string     * @return string           Quoted string     */    protected function _quote($value)    {        if (is_numeric($value)) {            return $value;        }        return "'" . addcslashes($value, "\000\n\r\\'\"\032") . "'";    }    /**     * Quote a table identifier and alias.     *     * @param string|array|Zend_Db_Expr $ident The identifier or expression.     * @param string $alias An alias for the table.     * @return string The quoted identifier and alias.     */    public function quoteTableAs($ident, $alias, $auto=false)    {        // Oracle doesn't allow the 'AS' keyword between the table identifier/expression and alias.        return $this->_quoteIdentifierAs($ident, $alias, $auto, ' ');    }    /**     * Returns a list of the tables in the database.     *     * @return array     */    public function listTables()    {        $data = $this->fetchCol('SELECT table_name FROM all_tables');        return $data;    }    /**     * Returns the column descriptions for a table.     *     * The return value is an associative array keyed by the column name,     * as returned by the RDBMS.     *     * The value of each array element is an associative array     * with the following keys:     *     * SCHEMA_NAME      => string; name of schema     * TABLE_NAME       => string;     * COLUMN_NAME      => string; column name     * COLUMN_POSITION  => number; ordinal position of column in table     * DATA_TYPE        => string; SQL datatype name of column     * DEFAULT          => string; default expression of column, null if none     * NULLABLE         => boolean; true if column can have nulls     * LENGTH           => number; length of CHAR/VARCHAR     * SCALE            => number; scale of NUMERIC/DECIMAL     * PRECISION        => number; precision of NUMERIC/DECIMAL     * UNSIGNED         => boolean; unsigned property of an integer type     * PRIMARY          => boolean; true if column is part of the primary key     * PRIMARY_POSITION => integer; position of column in primary key     * IDENTITY         => integer; true if column is auto-generated with unique values     *     * @todo Discover integer unsigned property.     *     * @param string $tableName     * @param string $schemaName OPTIONAL     * @return array     */    public function describeTable($tableName, $schemaName = null)    {        $sql = "SELECT TC.TABLE_NAME, TB.OWNER, TC.COLUMN_NAME, TC.DATA_TYPE,                TC.DATA_DEFAULT, TC.NULLABLE, TC.COLUMN_ID, TC.DATA_LENGTH,                TC.DATA_SCALE, TC.DATA_PRECISION, C.CONSTRAINT_TYPE, CC.POSITION            FROM ALL_TAB_COLUMNS TC            LEFT JOIN (ALL_CONS_COLUMNS CC JOIN ALL_CONSTRAINTS C                ON (CC.CONSTRAINT_NAME = C.CONSTRAINT_NAME AND CC.TABLE_NAME = C.TABLE_NAME AND C.CONSTRAINT_TYPE = 'P'))              ON TC.TABLE_NAME = CC.TABLE_NAME AND TC.COLUMN_NAME = CC.COLUMN_NAME            JOIN ALL_TABLES TB ON (TB.TABLE_NAME = TC.TABLE_NAME AND TB.OWNER = TC.OWNER)            WHERE TC.TABLE_NAME = ".$this->quote($tableName);        if ($schemaName) {            $sql .= " AND TB.OWNER = ".$this->quote($schemaName);        }        $sql .= ' ORDER BY TC.COLUMN_ID';        $stmt = $this->query($sql);        /**         * Use FETCH_NUM so we are not dependent on the CASE attribute of the PDO connection         */        $result = $stmt->fetchAll(Zend_Db::FETCH_NUM);        $table_name      = 0;        $owner           = 1;        $column_name     = 2;        $data_type       = 3;        $data_default    = 4;        $nullable        = 5;        $column_id       = 6;        $data_length     = 7;        $data_scale      = 8;        $data_precision  = 9;        $constraint_type = 10;        $position        = 11;        $desc = array();        foreach ($result as $key => $row) {            list ($primary, $primaryPosition, $identity) = array(false, null, false);            if ($row[$constraint_type] == 'P') {                $primary = true;                $primaryPosition = $row[$position];                /**                 * Oracle does not support auto-increment keys.                 */                $identity = false;            }            $desc[$this->foldCase($row[$column_name])] = array(                'SCHEMA_NAME'      => $this->foldCase($row[$owner]),                'TABLE_NAME'       => $this->foldCase($row[$table_name]),                'COLUMN_NAME'      => $this->foldCase($row[$column_name]),                'COLUMN_POSITION'  => $row[$column_id],                'DATA_TYPE'        => $row[$data_type],                'DEFAULT'          => $row[$data_default],                'NULLABLE'         => (bool) ($row[$nullable] == 'Y'),                'LENGTH'           => $row[$data_length],                'SCALE'            => $row[$data_scale],                'PRECISION'        => $row[$data_precision],                'UNSIGNED'         => null, // @todo                'PRIMARY'          => $primary,                'PRIMARY_POSITION' => $primaryPosition,                'IDENTITY'         => $identity            );        }        return $desc;    }    /**     * Return the most recent value from the specified sequence in the database.     * This is supported only on RDBMS brands that support sequences     * (e.g. Oracle, PostgreSQL, DB2).  Other RDBMS brands return null.     *     * @param string $sequenceName     * @return integer     */    public function lastSequenceId($sequenceName)    {        $this->_connect();        $value = $this->fetchOne('SELECT '.$this->quoteIdentifier($sequenceName, true).'.CURRVAL FROM dual');        return $value;    }    /**     * Generate a new value from the specified sequence in the database, and return it.     * This is supported only on RDBMS brands that support sequences     * (e.g. Oracle, PostgreSQL, DB2).  Other RDBMS brands return null.     *     * @param string $sequenceName     * @return integer     */    public function nextSequenceId($sequenceName)    {        $this->_connect();        $value = $this->fetchOne('SELECT '.$this->quoteIdentifier($sequenceName, true).'.NEXTVAL FROM dual');        return $value;    }    /**     * Gets the last ID generated automatically by an IDENTITY/AUTOINCREMENT column.     *     * As a convention, on RDBMS brands that support sequences     * (e.g. Oracle, PostgreSQL, DB2), this method forms the name of a sequence     * from the arguments and returns the last id generated by that sequence.     * On RDBMS brands that support IDENTITY/AUTOINCREMENT columns, this method     * returns the last value generated for such a column, and the table name     * argument is disregarded.     *     * Oracle does not support IDENTITY columns, so if the sequence is not     * specified, this method returns null.     *     * @param string $tableName   OPTIONAL Name of table.     * @param string $primaryKey  OPTIONAL Name of primary key column.     * @return integer     * @throws Zend_Db_Adapter_Oracle_Exception     */    public function lastInsertId($tableName = null, $primaryKey = null)    {        if ($tableName !== null) {            $sequenceName = $tableName;            if ($primaryKey) {                $sequenceName .= $this->foldCase("_$primaryKey");            }            $sequenceName .= $this->foldCase('_SEQ');            return $this->lastSequenceId($sequenceName);        }        return $this->_connection->lastInsertId($tableName);    }    /**     * Adds an adapter-specific LIMIT clause to the SELECT statement.     *     * @param string $sql     * @param integer $count     * @param integer $offset     * @return string     */    public function limit($sql, $count, $offset = 0)    {        $count = intval($count);        if ($count <= 0) {            throw new Zend_Db_Adapter_Exception("LIMIT argument count=$count is not valid");        }        $offset = intval($offset);        if ($offset < 0) {            throw new Zend_Db_Adapter_Exception("LIMIT argument offset=$offset is not valid");        }        /**         * Oracle does not implement the LIMIT clause as some RDBMS do.         * We have to simulate it with subqueries and ROWNUM.         * Unfortunately because we use the column wildcard "*",          * this puts an extra column into the query result set.         */        $limit_sql = "SELECT z2.*            FROM (                SELECT ROWNUM AS zend_db_rownum, z1.*                FROM (                    " . $sql . "                ) z1            ) z2            WHERE z2.zend_db_rownum BETWEEN " . ($offset+1) . " AND " . ($offset+$count);        return $limit_sql;    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -