用于自动创建DB表的脚本

时间:2013-04-09 11:14:29

标签: database oracle plsql

我必须创建一个脚本,该脚本创建必须具有1.000个表的架构,其中包含1.000列。 表名(示例):TABLE_058 列名(示例):T058_COL_078

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

2 个答案:

答案 0 :(得分: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之间,那么您应该没问题。

答案 1 :(得分:1)

导出架构的元数据。

exp userid=user/pass@db owner=someowner rows=n file=somefile.dmp

如果使用记事本打开文件,则可以看到DML语句。 然后,您可以使用

导入
imp userid=user/pass@otherdb file=somefile.dmp full=y

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

imp userid=user/pass@db file=somefile.dmp fromuser=someschema touser=otherschema

您还可以使用新数据泵进行并行和压缩增强。 看看this link