我想做一个将Oracle表结构及数据导入到另外的表空间内的程序。例如可以用select * from user_catalog获取表目录(包括Sequences)我想知道如何才能获取到Oracle数据库表的约束条件?最好用SQL语句实现,当然若有其他办法也欢迎跟帖。这是我当前找到的一些关于表信息的主要视图user_tab_columns、user_catalog、user_all_tables、user_col_comments、user_tab_comments等。谢谢~~~
调试欢乐多
我在Google上找了好久,就是没找到能获取约束条件的方法
楼主,是不是这个意思啊?
这个可能是你权限的问题
试试
select * from user_constraints
SQL> select constraint_name,constraint_type,table_name,r_constraint_name
2 from dba_constraints
3 where table_name='EMP';
CONSTRAINT_NAME C TABLE_NAME R_CONSTRAINT_NAME
-------------------- - -------------------- --------------------
FK_DEPTNO R EMP PK_DEPT --外键约束 参考DEPT表上的PK_DEPT主键约束
PK_EMP P EMP --EMP表上的主键约束--CONSTRAINT_NAME 约束名
--C 约束类型
--TABLE_NAME 约束所在的表的名称
--R_CONSTRAINT_NAME 被参考的约束名
SQL> select constraint_name,table_name,column_name
2 from all_cons_columns
3 where constraint_name='PK_EMP';
CONSTRAINT_NAME TABLE_NAME COLUMN_NAME
-------------------- -------------------- --------------------
PK_EMP EMP EMPNO
USER_CONS_COLUMNS从这两个中取就行了。
但是对于Checks就获取不到了
例如有一个:CKC_INDICATOR_FLAG_TB_TARGE INDICATOR_FLAG in (1,2)
现在就无法获取INDICATOR_FLAG in (1,2)啊
SQL> show user
USER is "SYS"
SQL> select dbms_metadata.get_ddl('CONSTRAINT','SYS_C0023321','SCOTT') from dual
;DBMS_METADATA.GET_DDL('CONSTRAINT','SYS_C0023321','SCOTT')
--------------------------------------------------------------------------------
ALTER TABLE "SCOTT"."T1" ADD CHECK (id in(1,2)) ENABLE
SQL> create table t1(id number check(id in(1,2)));Table created.SQL> insert into t1 values(3);
insert into t1 values(3)
*
ERROR at line 1:
ORA-02290: check constraint (SCOTT.SYS_C0023321) violated
感觉很变态,查找一个约束条件还要传用户名进去。我试了一下,返回的数据是
ALTER TABLE "HUAINANOA"."TB_TARGET" ADD CONSTRAINT "CKC_INDICATOR_FLAG_TB_TARGE" CHECK (INDICATOR_FLAG in (1,2)) ENABLE我用PLSQL导出的是
alter table TB_TARGET
add constraint CKC_INDICATOR_FLAG_TB_TARGE
check (INDICATOR_FLAG in (1,2));很好,很强大
那么其余的主外键是否也可以用类似的方法获取?它的dbms_metadata.get_ddl的第一个参数又是什么?
如果你嫌不够详细 那么使用dbms_metadata.get_ddl也行
比如说来获得SCOTT的EMP表上的PK_EMP主键约束
SQL> set long 10000 --设置格式
SQL> select dbms_metadata.get_ddl('CONSTRAINT','PK_EMP','SCOTT') from dual;
DBMS_METADATA.GET_DDL('CONSTRAINT','PK_EMP','SCOTT')
--------------------------------------------------------------------------------
ALTER TABLE "SCOTT"."EMP" ADD CONSTRAINT "PK_EMP" PRIMARY KEY ("EMPNO")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUT
E STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 214
7483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "USERS" ENABLEdbms_metadata.get_ddl的第一个参数是对象类型
第二个参数是对象名称
第三个参数是对象所有者