免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4008 | 回复: 9
打印 上一主题 下一主题

[求助] Oracle下如何获取一个表的完整建表信息 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-10-07 10:29 |只看该作者 |倒序浏览
10可用积分
和informix类似的
dbschema 的东西,
比如我可以
dbschema -d database -t table -ss table.sql
就能获取指定的table的完整的一个建表语句。
oracle怎么做?

最佳答案

查看完整内容

针对单个表:SQL> set long 2000SQL> set pagesize 0SQL> select dbms_metadata.get_ddl('TABLE','EMP','SCOTT') from dual; CREATE TABLE "SCOTT"."EMP" ( "EMPNO" NUMBER(4,0), "ENAME" VARCHAR2(10), "JOB" VARCHAR2(9), "MGR" NUMBER(4,0), "HIREDATE" DATE, "SAL" NUMBER(7,2), "COMM" NUMBER(7,2), "DEPTNO" NUMBER(2,0), CONSTRAINT "PK_EMP" PRIMARY KEY ...

招聘 : Linux运维
论坛徽章:
0
2 [报告]
发表于 2007-10-07 10:29 |只看该作者
针对单个表:
SQL> set long 2000
SQL> set pagesize 0
SQL> select dbms_metadata.get_ddl('TABLE','EMP','SCOTT') from dual;

  CREATE TABLE "SCOTT"."EMP"
   (    "EMPNO" NUMBER(4,0),
        "ENAME" VARCHAR2(10),
        "JOB" VARCHAR2(9),
        "MGR" NUMBER(4,0),
        "HIREDATE" DATE,
        "SAL" NUMBER(7,2),
        "COMM" NUMBER(7,2),
        "DEPTNO" NUMBER(2,0),
         CONSTRAINT "PK_EMP" PRIMARY KEY ("EMPNO")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "USERS"  ENABLE,
         CONSTRAINT "FK_DEPTNO" FOREIGN KEY ("DEPTNO")
          REFERENCES "SCOTT"."DEPT" ("DEPTNO") ENABLE
   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "USERS"

论坛徽章:
0
3 [报告]
发表于 2007-10-07 10:36 |只看该作者
请使用PL/SQL DEVELOPER

论坛徽章:
0
4 [报告]
发表于 2007-10-07 10:37 |只看该作者
不行,我需要程序里面实现的。

论坛徽章:
0
5 [报告]
发表于 2007-10-07 11:06 |只看该作者
本质其实是只有一句话: DBMS_METADATA.GET_DDL( 'TABLE', u.table_name )

下面是我丰富了的功能。


读取object并解析出DDL写入文件存到UNIX上
[Typeset page]

(1) 准备工作
unix 最低权限:
chmod 010 test_xbrl_dir
d-----x---   2 dev5ap     dba           8192 Jul  6 16:37 test_xbrl_dir

建立一个directory XMLDIR

(2)实现思路: 读取object 并解析出DDL ,结果为CLOB类型. 写入文件. 存到UNIX上.
/*------------------------------------------------------------------------------
  Current Version : 0.01
  Create          : Joodhawk Lin 06/07/2006
  Purpose         : out put dll
  Description     :
  Special Input   :
  Output          :
  Demo            :
  Update          : (1) Joodhawk, 06/07/2006
                        created.
------------------------------------------------------------------------------*/
    PROCEDURE output_ddl
    IS
        v_clob         CLOB;
    BEGIN
        SELECT DBMS_METADATA.GET_DDL( 'TABLE', u.table_name )
          INTO v_clob
          FROM USER_TABLES u
         WHERE u.table_name = 'xx_JoodHawk_1511';

        PRINTCLOBOUT(
            p_filename => 'ABC.SQL',
            p_result => v_clob);

    EXCEPTION
        WHEN OTHERS THEN
            DBMS_OUTPUT.put_line(
                   'Error'
                || SQLERRM
                || SQLCODE );
    END;

    PROCEDURE PRINTCLOBOUT(
        p_filename   IN            VARCHAR2,
        p_result     IN OUT NOCOPY CLOB )
    IS
        v_line         VARCHAR2( 32767 );
        v_outputfile   UTL_FILE.FILE_TYPE;
        v_path_name    all_directories.directory_name%TYPE;
        v_amount       BINARY_INTEGER                        := 1;
        v_position     INTEGER                               := 1;
        v_pattern        VARCHAR2( 1 );
    BEGIN
        v_path_name :='XMLDIR';
        DBMS_OUTPUT.put_line( v_path_name || p_filename);
        v_outputfile := UTL_FILE.FOPEN( v_path_name,
                                      p_filename,
                                      'w' );
        v_pattern := CHR( 10 );
        v_amount := DBMS_LOB.INSTR( p_result,
                                  v_pattern,
                                  v_position,
                                  1 ) - v_position + 1;

        WHILE v_amount > 0
        LOOP
            DBMS_LOB.READ( p_result,
                           v_amount,
                           v_position,
                           v_line );
            UTL_FILE.put_line( v_outputfile, v_line );
            v_position := DBMS_LOB.INSTR( p_result,
                                        v_pattern,
                                        v_position,
                                        1 ) + 1;
            v_amount := DBMS_LOB.INSTR( p_result,
                                      v_pattern,
                                      v_position,
                                      1 ) - v_position + 1;
            v_line := NULL;
        END LOOP;

        UTL_FILE.fclose( v_outputfile );
    EXCEPTION
        WHEN OTHERS THEN
            DBMS_OUTPUT.put_line( 'error: ' || SQLCODE || SQLERRM );
    END;

(3)有用的点3个.

1,写文件要什么权限呢?

啥也不用,以前还搞个什么 grant权限,其实是没用的. 只要unix 上面的那个目录对Group有EXECUTE权限就ok.

2,用的oracle的package的来实现抓取 object的dll的.

3,写文件.

论坛徽章:
0
6 [报告]
发表于 2007-10-07 13:51 |只看该作者
谢谢你的回复。
我试验了一下
SELECT DBMS_METADATA.GET_DDL( 'TABLE', u.table_name )
          INTO v_clob
          FROM USER_TABLES u
         WHERE u.table_name = 'xx';

这句话拿出来执行,结果是“no rows selected”
实际上,肯定有“xx”这个表。
因为我
desc  xx

可以看到表结构。

不知道是我什么地方出了差错

招聘 : Linux运维
论坛徽章:
0
7 [报告]
发表于 2007-10-07 16:44 |只看该作者
scott用户所有的表:

SQL> show user
USER 为 "SCOTT"
SQL> set long 2000
SQL> set pagesize 0
SQL> select dbms_metadata.get_ddl('TABLE',u.table_name)
  2  from user_tables u;

  CREATE TABLE "SCOTT"."DEPT"
   (    "DEPTNO" NUMBER(2,0),
        "DNAME" VARCHAR2(14),
        "LOC" VARCHAR2(13),
         CONSTRAINT "PK_DEPT" PRIMARY KEY ("DEPTNO")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "USERS"  ENABLE
   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "USERS"



  CREATE TABLE "SCOTT"."EMP"
   (    "EMPNO" NUMBER(4,0),

招聘 : Linux运维
论坛徽章:
0
8 [报告]
发表于 2007-10-07 17:31 |只看该作者
找到跟scott.emp关联的index的定义

SQL> select dbms_metadata.get_dependent_ddl('INDEX','EMP','SCOTT') from dual;

  CREATE INDEX "SCOTT"."INDEX_EMP_ENAME" ON "SCOTT"."EMP" ("ENAME")
  PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "USERS"

  CREATE INDEX "SCOTT"."INDEX_EMP_SAL_JOB" ON "SCOTT"."EMP" ("SAL", "JOB")
  PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "USERS"

  CREATE UNIQUE INDEX "SCOTT"."PK_EMP" ON "SCOTT"."EMP" ("EMPNO")
  PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "USERS"

招聘 : Linux运维
论坛徽章:
0
9 [报告]
发表于 2007-10-07 17:33 |只看该作者
回悬赏贴从来都是到最后看不到楼主的回信。。。。。



这个冤枉楼主了

[ 本帖最后由 天涯明月刀 于 2007-10-8 10:21 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2007-10-13 14:25 |只看该作者
呵呵,我1000多分都散了出去,不会赖你10分的。看看我的信誉积分?呵呵
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP