Oracle中的数据字典有静态和动态之分。静态数据字典主要是在用户访 问数据字典时不会发生改变的,但动态数据字典是依赖数据库运行的性能的,反映数据库运行的一些内在信息,所以在访问这类数据字典时往往不是一成不变的。
静态数据字典主要是由表和视图组成,应该注意的是,数据字典中的表是不能直接被访问的,但是可以访问数据字典中的视图。静态数据字典中的视图分为三类,它们分别由三个前缀够成:user_*、all_*、dba_*。
这里主要介绍user的常用视图及其用法。
主要描述当前用户的信息,主要包括当前用户名、帐户id、帐户状态、表空间名、创建时间等。例如执行下列命令即可返回这些信息。
主要描述当前用户拥有的所有对象的信息,对象包括表、视图、存储过程、触发器、包、索引、序列等。该视图比user_tables视图更加全面。
字段名 | 解释 |
---|---|
object_name | 对象名称 |
object_id | 对象id |
created | 对象的创建时间 |
last_ddl_time | 跟对象相关的(不一定是改变对象的结构,也可以是其他相关,如,如果此对象是表,则将该表的select权限赋给其他用户也会改变这个字段的值)最最近ddl操作的执行时间 |
timestamp | 对象自身结构发生改变的时间,比如删除字段、添加字段等 |
object_type | 对象类型 |
status | 状态 |
…… |
主要描述当前用户拥有的所有表的信息,主要包括表名、表空间名、簇名等。通过此视图可以清楚了解当前用户可以操作的表有哪些。
字段名 | 解释 |
---|---|
TABLE_NAME | 表名 |
TABLESPACE_NAME | |
CLUSTER_NAME | |
NUM_ROWS | 表中的数据行数 |
STATUS | |
PCT_FREE | |
PCT_USED | |
INI_TRANS | |
MAX_TRANS | |
INITIAL_EXTENT | |
…… |
字段名 | 解释 |
---|---|
table_name | 表名或视图名 |
Table_type | 类型(TABLE/VIEW) |
comments | 已经为该列输入的注释 |
字段名 | 解释 |
---|---|
table_name | 表名或视图名 |
column_name | 列名 |
comments | 已经为该列输入的注释 |
该视图主要是存储当前用户下对所有表的权限信息。当前用户对该表的权限就可以清楚的知道,哪些操作可以执行,哪些操作不能执行。
user_constraints是表约束的视图,描述的是约束类型(constraint_type)是什么,属于哪些表(table_name),如果约束的类型为R(外键)的话,那么r_constraint_name字段存放的就是被引用主表中的主键约束名。
user_cons_columns是表约束字段的视图,说明表中的和约束相关的列参与了哪些约束。这些约束有主键约束,外键约束,索引约束.
两者可以通过(owner,constraint_name,table_name)关联
利用数据字典,辅助开发和实施,是极好的~~~
偷懒必学,尤其是做数据迁移,批量处理数据或者数据表大范围整改时!
select 'comment on table '||table_name||' is
'''||comments||''';' from user_tab_comments where
comments is not null;
select 'comment on column '||table_name||'.'
||column_name||' is '''||comments||''';'
from user_col_comments where comments is not null;
select c.constraint_name index_name,
decode(t.constraint_type, 'P', 1, 0) type,
c.table_name,
c.column_name
from user_constraints t, user_cons_columns c
where c.constraint_name = t.constraint_name
and c.column_name not like 'SYS_NC%$'
and t.constraint_type in ('P', 'U');
其中constraint_type的值为P时 表示Primary Key,即主键,R表示Referential AKA Foreign Key,即外键,U表示Unique Key,即唯一键。
select 'alter table ' || t.TABLE_NAME || ' rename column
"' || column_name ||'" to "' || upper(column_name) || '";'
from user_tab_columns t;
select object_type,status from user_objects where object_name=upper('package1');
注意upper的使用,数据字典里的所有对象均为大写形式,而PL/SQL里不是大小写敏感的,所以在实际操作中一定要注意大小写匹配。
首先建一个clob字段名+_1的字段,用于替代
select 'alter table ' || table_name ||' add
'||column_name||'_1 blob;' from user_tab_columns where
data_type='CLOB';
然后通过一个转换方法把Clob字段的数据转为BLOB并且存到新建字段中
select 'update '||table_name||' set ' ||column_name ||
'_1=clob_to_blob('|| column_name ||');' from
user_tab_columns where data_type='CLOB';
这时候可以把原来的clob字段删除了
select 'alter table ' || table_name ||' drop column
'||column_name||';' from user_tab_columns where
data_type='CLOB';
最后把新建字段改为原来字段一样的名字,即把_1去掉
select 'alter table '||table_name||' rename column
'||column_name||' to '||replace(column_name,'_1','')||';'
from user_tab_columns where data_type='BLOB';
select username,default_tablespace from user_users;
SQL>select object_name,object_id from user_objects
where instr(object_name,'LOG')>0;
后续使用时再不断补充……