COciSchema


system.db.schema.oci
继承 class COciSchema » CDbSchema » CComponent
版本 $Id: COciSchema.php 3515 2011-12-28 12:29:24Z mdomba $
源码
COciSchema是从Oracle数据库检索元数据信息的类。

公共属性

属性 类型 描述 定义在
columnTypes array 映射到实体列类型的抽象列类型。 COciSchema
commandBuilder CDbCommandBuilder the SQL command builder for this connection. CDbSchema
dbConnection CDbConnection database connection. CDbSchema
defaultSchema string 默认schema。 COciSchema
tableNames array Returns all table names in the database. CDbSchema
tables array Returns the metadata for all tables in the database. CDbSchema

公共方法

方法 描述 定义在
__call() 如果类中没有调的方法名,则调用这个方法。 CComponent
__construct() Constructor. CDbSchema
__get() 返回一个属性值、一个事件处理程序列表或一个行为名称。 CComponent
__isset() 检查一个属性是否为null。 CComponent
__set() 设置一个组件的属性值。 CComponent
__unset() 设置一个组件的属性为null。 CComponent
addColumn() Builds a SQL statement for adding a new DB column. CDbSchema
addForeignKey() Builds a SQL statement for adding a foreign key constraint to an existing table. CDbSchema
alterColumn() 构造改变列定义的SQL语句。 COciSchema
asa() 返回这个名字的行为对象。 CComponent
attachBehavior() 附加一个行为到组件。 CComponent
attachBehaviors() 附加一个行为列表到组件。 CComponent
attachEventHandler() 为事件附加一个事件处理程序。 CComponent
canGetProperty() 确定属性是否可读。 CComponent
canSetProperty() 确定属性是否可写。 CComponent
checkIntegrity() Enables or disables integrity check. CDbSchema
compareTableNames() Compares two table names. CDbSchema
createIndex() Builds a SQL statement for creating a new index. CDbSchema
createTable() Builds a SQL statement for creating a new DB table. CDbSchema
detachBehavior() 从组件中分离一个行为。 CComponent
detachBehaviors() 从组件中分离所有行为。 CComponent
detachEventHandler() 分离一个存在的事件处理程序。 CComponent
disableBehavior() 禁用一个附加行为。 CComponent
disableBehaviors() 禁用组件附加的所有行为。 CComponent
dropColumn() Builds a SQL statement for dropping a DB column. CDbSchema
dropForeignKey() Builds a SQL statement for dropping a foreign key constraint. CDbSchema
dropIndex() 构造删除索引的SQL语句。 COciSchema
dropTable() Builds a SQL statement for dropping a DB table. CDbSchema
enableBehavior() 启用一个附加行为。 CComponent
enableBehaviors() 启用组件附加的所有行为。 CComponent
evaluateExpression() 计算一个PHP表达式,或根据组件上下文执行回调。 CComponent
getColumnType() Converts an abstract column type into a physical column type. CDbSchema
getCommandBuilder() 返回the SQL command builder for this connection. CDbSchema
getDbConnection() 返回database connection. The connection is active. CDbSchema
getDefaultSchema() 返回默认schema。 COciSchema
getEventHandlers() 返回一个事件的附加处理程序列表。 CComponent
getTable() Obtains the metadata for the named table. CDbSchema
getTableNames() Returns all table names in the database. CDbSchema
getTables() Returns the metadata for all tables in the database. CDbSchema
hasEvent() 确定一个事件是否定义。 CComponent
hasEventHandler() 检查事件是否有附加的处理程序。 CComponent
hasProperty() 确定属性是否被定义。 CComponent
quoteColumnName() Quotes a column name for use in a query. CDbSchema
quoteSimpleColumnName() 用引号引用列名以便查询时使用。 COciSchema
quoteSimpleTableName() 用引号引用表名以便查询时使用。 COciSchema
quoteTableName() Quotes a table name for use in a query. CDbSchema
raiseEvent() 发起一个事件。 CComponent
refresh() Refreshes the schema. CDbSchema
renameColumn() Builds a SQL statement for renaming a column. CDbSchema
renameTable() 构造重命名数据表的SQL语句。 COciSchema
resetSequence() Resets the sequence value of a table's primary key. CDbSchema
setDefaultSchema() 设置默认schema。 COciSchema
truncateTable() Builds a SQL statement for truncating a DB table. CDbSchema

受保护方法

方法 描述 定义在
createColumn() 创建一个列。 COciSchema
createCommandBuilder() 为数据库创建命令构建器。 COciSchema
findColumns() 收集列的元数据。 COciSchema
findConstraints() 收集给定表主键列和外键列的详细信息。 COciSchema
findTableNames() 返回所有数据库里的表名。 COciSchema
getSchemaTableName() 返回($schemaName,$tableName)形式的数组 COciSchema
loadTable() 为指定表载入元数据。 COciSchema
resolveTableNames() 生成各种表名。 COciSchema

属性详细

columnTypes 属性 (可用自 v1.1.6)
public array $columnTypes;

映射到实体列类型的抽象列类型。

defaultSchema 属性
public string getDefaultSchema()
public void setDefaultSchema(string $schema)

默认schema。

方法详细

alterColumn() 方法 (可用自 v1.1.6)
public string alterColumn(string $table, string $column, string $type)
$table string 要改变的列所在表。该表名会被指定方法正确引用。
$column string 要改变的列名。该列名会被指定方法正确引用。
$type string 新的列类型。getColumnType方法会被调用来将虚拟列类型(若存在) 转换为对应的实体列类型。任何未被识别为虚拟类型的类型会被保留在生成的SQL中。 例如,‘string’会被转为‘varchar(255)’,而‘string not null’会被转为‘varchar(255) not null’。
{return} string 改变列定义的SQL语句。
public function alterColumn($table$column$type)
{
    
$type=$this->getColumnType($type);
    
$sql='ALTER TABLE ' $this->quoteTableName($table) . ' MODIFY '
        
$this->quoteColumnName($column) . ' '
        
$this->getColumnType($type);
    return 
$sql;
}

构造改变列定义的SQL语句。

createColumn() 方法
protected CDbColumnSchema createColumn(array $column)
$column array 列元数据
{return} CDbColumnSchema 规范的列元数据
protected function createColumn($column)
{
    
$c=new COciColumnSchema;
    
$c->name=$column['COLUMN_NAME'];
    
$c->rawName=$this->quoteColumnName($c->name);
    
$c->allowNull=$column['NULLABLE']==='Y';
    
$c->isPrimaryKey=strpos($column['KEY'],'P')!==false;
    
$c->isForeignKey=false;
    
$c->init($column['DATA_TYPE'],$column['DATA_DEFAULT']);

    return 
$c;
}

创建一个列。

createCommandBuilder() 方法
protected CDbCommandBuilder createCommandBuilder()
{return} CDbCommandBuilder 命令构建器实例
protected function createCommandBuilder()
{
    return new 
COciCommandBuilder($this);
}

为数据库创建命令构建器。 该方法可以被子类重写以创建一个指定DBMS的命令构建器。

dropIndex() 方法 (可用自 v1.1.6)
public string dropIndex(string $name, string $table)
$name string 要删除的索引名。该索引名会被指定方法正确引用。
$table string 要删除的索引所在表。该表名会被指定方法正确引用。
{return} string 删除索引的SQL语句。
public function dropIndex($name$table)
{
    return 
'DROP INDEX '.$this->quoteTableName($name);
}

构造删除索引的SQL语句。

findColumns() 方法
protected boolean findColumns(COciTableSchema $table)
$table COciTableSchema 表元数据
{return} boolean 表是否存在于数据库里
protected function findColumns($table)
{
    
$schemaName=$table->schemaName;
    
$tableName=$table->name;

    
$sql=<<<EOD
SELECT a.column_name, a.data_type ||
case
    when data_precision is not null
        then '(' || a.data_precision ||
                case when a.data_scale > 0 then ',' || a.data_scale else '' end
            || ')'
    when data_type = 'DATE' then ''
    when data_type = 'NUMBER' then ''
    else '(' || to_char(a.data_length) || ')'
end as data_type,
a.nullable, a.data_default,
(   SELECT D.constraint_type
    FROM ALL_CONS_COLUMNS C
    inner join ALL_constraints D on D.OWNER = C.OWNER and D.constraint_name = C.constraint_name
    WHERE C.OWNER = B.OWNER
       and C.table_name = B.object_name
       and C.column_name = A.column_name
       and D.constraint_type = 'P') as Key
FROM ALL_TAB_COLUMNS A
inner join ALL_OBJECTS B ON b.owner = a.owner and ltrim(B.OBJECT_NAME) = ltrim(A.TABLE_NAME)
WHERE
a.owner = '
{$schemaName}'
and (b.object_type = 'TABLE' or b.object_type = 'VIEW')
and b.object_name = '
{$tableName}'
ORDER by a.column_id
EOD;

    
$command=$this->getDbConnection()->createCommand($sql);

    if((
$columns=$command->queryAll())===array()){
        return 
false;
    }

    foreach(
$columns as $column)
    {
        
$c=$this->createColumn($column);

        
$table->columns[$c->name]=$c;
        if(
$c->isPrimaryKey)
        {
            if(
$table->primaryKey===null)
                
$table->primaryKey=$c->name;
            else if(
is_string($table->primaryKey))
                
$table->primaryKey=array($table->primaryKey,$c->name);
            else
                
$table->primaryKey[]=$c->name;
            
$table->sequenceName='';
            
$c->autoIncrement=true;
        }
    }
    return 
true;
}

收集列的元数据。

findConstraints() 方法
protected void findConstraints(COciTableSchema $table)
$table COciTableSchema 表元数据
protected function findConstraints($table)
{
    
$sql=<<<EOD
    SELECT D.constraint_type as CONSTRAINT_TYPE, C.COLUMN_NAME, C.position, D.r_constraint_name,
            E.table_name as table_ref, f.column_name as column_ref,
            C.table_name
    FROM ALL_CONS_COLUMNS C
    inner join ALL_constraints D on D.OWNER = C.OWNER and D.constraint_name = C.constraint_name
    left join ALL_constraints E on E.OWNER = D.r_OWNER and E.constraint_name = D.r_constraint_name
    left join ALL_cons_columns F on F.OWNER = E.OWNER and F.constraint_name = E.constraint_name and F.position = c.position
    WHERE C.OWNER = '
{$table->schemaName}'
       and C.table_name = '
{$table->name}'
       and D.constraint_type <> 'P'
    order by d.constraint_name, c.position
EOD;
    
$command=$this->getDbConnection()->createCommand($sql);
    foreach(
$command->queryAll() as $row)
    {
        if(
$row['CONSTRAINT_TYPE']==='R')   // foreign key
        
{
            
$name $row["COLUMN_NAME"];
            
$table->foreignKeys[$name]=array($row["TABLE_REF"], $row["COLUMN_REF"]);
            if(isset(
$table->columns[$name]))
                
$table->columns[$name]->isForeignKey=true;
        }

    }
}

收集给定表主键列和外键列的详细信息。

findTableNames() 方法
protected array findTableNames(string $schema='')
$schema string 表schema。默认是空字符串,意味着当前或默认schema。 若为空,则返回的表名会被加上schema名前缀。
{return} array 数据库里的所有表名。
protected function findTableNames($schema='')
{
    if(
$schema==='')
    {
        
$sql=<<<EOD
SELECT table_name, '{$schema}' as table_schema FROM user_tables
EOD;
        
$command=$this->getDbConnection()->createCommand($sql);
    }
    else
    {
        
$sql=<<<EOD
SELECT object_name as table_name, owner as table_schema FROM all_objects
WHERE object_type = 'TABLE' AND owner=:schema
EOD;
        
$command=$this->getDbConnection()->createCommand($sql);
        
$command->bindParam(':schema',$schema);
    }

    
$rows=$command->queryAll();
    
$names=array();
    foreach(
$rows as $row)
    {
        if(
$schema===$this->getDefaultSchema() || $schema==='')
            
$names[]=$row['TABLE_NAME'];
        else
            
$names[]=$row['TABLE_SCHEMA'].'.'.$row['TABLE_NAME'];
    }
    return 
$names;
}

返回所有数据库里的表名。

getDefaultSchema() 方法
public string getDefaultSchema()
{return} string 默认schema。
public function getDefaultSchema()
{
    if (!
strlen($this->_defaultSchema))
    {
        
$this->setDefaultSchema(strtoupper($this->getDbConnection()->username));
    }

    return 
$this->_defaultSchema;
}

getSchemaTableName() 方法
protected array getSchemaTableName(string $table)
$table string 带有可选schema名作为前缀的表名,不提供使用默认schema名作为前缀的表名。
{return} array ($schemaName,$tableName)形式的数组
protected function getSchemaTableName($table)
{
    
$table strtoupper($table);
    if(
count($partsexplode('.'str_replace('"','',$table))) > 1)
        return array(
$parts[0], $parts[1]);
    else
        return array(
$this->getDefaultSchema(),$parts[0]);
}

loadTable() 方法
protected CDbTableSchema loadTable(string $name)
$name string 表名
{return} CDbTableSchema 取决于表元数据的驱动。
protected function loadTable($name)
{
    
$table=new COciTableSchema;
    
$this->resolveTableNames($table,$name);

    if(!
$this->findColumns($table))
        return 
null;
    
$this->findConstraints($table);

    return 
$table;
}

为指定表载入元数据。

quoteSimpleColumnName() 方法 (可用自 v1.1.6)
public string quoteSimpleColumnName(string $name)
$name string 列名
{return} string 正确引用的列名
public function quoteSimpleColumnName($name)
{
    return 
'"'.$name.'"';
}

用引号引用列名以便查询时使用。 一个不包括前缀的简单列名。

quoteSimpleTableName() 方法 (可用自 v1.1.6)
public string quoteSimpleTableName(string $name)
$name string 表名
{return} string 正确引用的表名
public function quoteSimpleTableName($name)
{
    return 
'"'.$name.'"';
}

用引号引用表名以便查询时使用。 一个不包括前缀的简单表名。

renameTable() 方法 (可用自 v1.1.6)
public string renameTable(string $table, string $newName)
$table string 要重命名的表。该表名会被指定方法正确引用。
$newName string 新表名。 该表名会被指定方法正确引用。
{return} string 重命名数据表的SQL语句。
public function renameTable($table$newName)
{
    return 
'ALTER TABLE ' $this->quoteTableName($table) . ' RENAME TO ' $this->quoteTableName($newName);
}

构造重命名数据表的SQL语句。

resolveTableNames() 方法
protected void resolveTableNames(COciTableSchema $table, string $name)
$table COciTableSchema 表元数据
$name string 未引用的表名
protected function resolveTableNames($table,$name)
{
    
$parts=explode('.',str_replace('"','',$name));
    if(isset(
$parts[1]))
    {
        
$schemaName=$parts[0];
        
$tableName=$parts[1];
    }
    else
    {
        
$schemaName=$this->getDefaultSchema();
        
$tableName=$parts[0];
    }

    
$table->name=$tableName;
    
$table->schemaName=$schemaName;
    if(
$schemaName===$this->getDefaultSchema())
        
$table->rawName=$this->quoteTableName($tableName);
    else
        
$table->rawName=$this->quoteTableName($schemaName).'.'.$this->quoteTableName($tableName);
}

生成各种表名。

setDefaultSchema() 方法
public void setDefaultSchema(string $schema)
$schema string 默认schema。
public function setDefaultSchema($schema)
{
    
$this->_defaultSchema=$schema;
}