我想做一个将Oracle表结构及数据导入到另外的表空间内的程序。例如可以用select * from user_catalog获取表目录(包括Sequences)我想知道如何才能获取到Oracle数据库表的约束条件?最好用SQL语句实现,当然若有其他办法也欢迎跟帖。这是我当前找到的一些关于表信息的主要视图user_tab_columns、user_catalog、user_all_tables、user_col_comments、user_tab_comments等。谢谢~~~

解决方案 »

  1.   

    肯定可以的,若是没法获取,远的不说,就PLSQL的好多功能都不能用了。
    我在Google上找了好久,就是没找到能获取约束条件的方法
      

  2.   

    直接查一下dba视图select * from dba_constraints 不就知道了?
    楼主,是不是这个意思啊?
      

  3.   


    这个可能是你权限的问题
    试试
    select * from user_constraints 
      

  4.   

    --举个例子 比如说查看SCOTT用户下EMP表上的约束
    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 被参考的约束名
      

  5.   

    呵呵 查询另外一个视图就可以得到了就以上面的那个PK_EMP主键约束为例
    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
      

  6.   

    USER_CONSTRAINTS
    USER_CONS_COLUMNS从这两个中取就行了。
      

  7.   


    但是对于Checks就获取不到了
    例如有一个:CKC_INDICATOR_FLAG_TB_TARGE INDICATOR_FLAG in (1,2)
    现在就无法获取INDICATOR_FLAG in (1,2)啊
      

  8.   

    可以通过dbms_metadata.get_ddl来查看当时定义这个CHECK约束时的语句
    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
      

  9.   

    下面是在SCOTT用户下创建表和约束时的语句
    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
      

  10.   


    感觉很变态,查找一个约束条件还要传用户名进去。我试了一下,返回的数据是
    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的第一个参数又是什么?
      

  11.   

    CHECK 当然取不到了,你只能分析它的内容。因为你根本不知道CHECK中会做什么。
      

  12.   

    其余的主外键可以使用#6和#8的方法啊
    如果你嫌不够详细 那么使用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的第一个参数是对象类型
    第二个参数是对象名称
    第三个参数是对象所有者