2013-04-09 30 views
1

我必须创建一个脚本,该脚本创建必须具有1.000个表的1000个列的表。 表名称(示例):TABLE_058 列名称(示例):T058_COL_078用于自动创建数据库表的脚本

表格应该为空。我正在使用Oracle DB,并不太适合使用SQL/PL-SQL。 如果有人指出我的方向是正确的,那将是非常有必要的。

回答

2

如果将其另存为脚本,然后在SQL * Plus下执行它,将会生效。这些表格被命名为TABLE_000TABLE_999并且这些列被类似地测序000999

SET ECHO OFF 
SET TERMOUT OFF 
SET TRIMSPOOL ON 
SET PAGESIZE 0 
SET LINESIZE 2000 
SET FEEDBACK OFF 
SPOOL C:\CreateTables.sql 

SELECT 
    CASE 
    WHEN ColIndex = 0 THEN 'CREATE TABLE TABLE_' || TO_CHAR(TableIndex, 'FM000') || '  (' 
    ELSE NULL 
    END || 
    ' T' || TO_CHAR(TableIndex, 'FM000') || '_COL_' || TO_CHAR(ColIndex, 'FM000') || ' VARCHAR2(1)' || 
    CASE 
    WHEN ColIndex = 999 THEN ');' 
    ELSE ',' 
    END 
FROM (
    SELECT TableIndex, ColIndex FROM (
    SELECT LEVEL - 1 AS TableIndex FROM DUAL CONNECT BY LEVEL <= 1000) 
    CROSS JOIN (
    SELECT LEVEL - 1 AS ColIndex FROM DUAL CONNECT BY LEVEL <= 1000) 
    ORDER BY TableIndex, ColIndex); 

SPOOL OFF 

需要注意以下几点:

  • 的编号方案是从000到999,因为你的表/列名模板使用三位数字和只有这样,才能像1000表/列即从零开始。

  • SPOOL C:\CreateTables.sql中的文件名更改为适合您的文件名。

  • 没有指定列类型,因此上面的脚本有他们都为VARCHAR2(1)

  • 运行上述从SQL脚本是很重要的* Plus的。如果你不这样做,很多SQL * Plus喋喋不休都会在假脱机输出中结束。要从SQL * Plus运行脚本,只需输入“at”符号(@),然后键入脚本名称即可。如果你的名字TableGenScript.sql那么这样做:

    SQL> @TableGenScript.sql 
    

从脚本输出的前几行是这样的:

CREATE TABLE TABLE_000 ( T000_COL_000 VARCHAR2(1), 
    T000_COL_001 VARCHAR2(1), 
    T000_COL_002 VARCHAR2(1), 
    T000_COL_003 VARCHAR2(1), 

试试看吧,你应该能够调整这符合你的具体需求。


附录 NikolaB问到如何改变列的类型,答案是太长,无法在评论...

要改变列类型,请采用|| ' VARCHAR2(1)' ||的查询部分,并将其替换为您的数据类型逻辑。例如,如果列0-599是VARCHAR2,列600-899是NUMBER和列900-999是DATE,改剧本是这样的:

... all the SETs like above, then the SPOOL ... 

SELECT 
    CASE 
    WHEN ColIndex = 0 THEN 'CREATE TABLE TABLE_' || TO_CHAR(TableIndex, 'FM000') || '  (' 
    ELSE NULL 
    END || 
    ' T' || TO_CHAR(TableIndex, 'FM000') || '_COL_' || TO_CHAR(ColIndex, 'FM000') || 

    CASE -- put the data-type logic in this CASE 
    WHEN ColIndex BETWEEN 0 AND 599 THEN ' VARCHAR2(1)' 
    WHEN ColIndex BETWEEN 600 AND 899 THEN ' NUMBER' 
    ELSE ' DATE' 
    END || -- data-type logic ends here and original query resumes 

    CASE 
    WHEN ColIndex = 999 THEN ');' 
    ELSE ',' 
    END 
FROM 
... and then the same as above, all the way through to the SPOOL OFF 

我已经强调了CASE声明以评论。如果你把你的数据类型逻辑在CASEEND之间,你应该没问题。

+0

非常感谢!我在定制脚本时遇到了困难,你是否有一些有用的链接可以从中了解语法。我必须有三种类型的列数据(varchar2,日期,数字),但我不能写出没有错误。这让我感到很蠢,听起来很简单。 – NikolaB 2013-04-12 13:47:26

+1

@NikolaB - 这远非简单,所以不要觉得笨拙。我不认为你会在网上找到任何有针对性的帮助,所以我已经更新了我的答案。查看最后的“附录”以获得有关改变数据类型的帮助。 – 2013-04-12 14:28:06

1

导出架构的元数据。

exp userid=user/[email protected] owner=someowner rows=n file=somefile.dmp 

如果使用记事本打开文件,您可以看到DML语句。 那么你可以导入使用

imp userid=user/[email protected] file=somefile.dmp full=y 

你也可以复制到另一个模式在同一个数据库(通常用于测试)

imp userid=user/[email protected] file=somefile.dmp fromuser=someschema touser=otherschema 

你也可以使用并行压缩增强新的数据泵。 检出this link