Database 用于自动创建数据库表的脚本

Database 用于自动创建数据库表的脚本,database,oracle,plsql,Database,Oracle,Plsql,我必须制作一个脚本,创建一个必须有1.000个表和1.000个列的模式。 表名(示例):表_058 列名(示例):T058\u COL\u 078 表应该是空的。我正在使用Oracle DB,但不太适合使用SQL/PL-SQL。 如果有人能给我指出正确的方向,我将不胜感激。导出模式的元数据 exp userid=user/pass@db owner=someowner rows=n file=somefile.dmp 如果使用记事本打开文件,则可以看到DML语句。 然后可以使用 imp use

我必须制作一个脚本,创建一个必须有1.000个表和1.000个列的模式。 表名(示例):表_058 列名(示例):T058\u COL\u 078

表应该是空的。我正在使用Oracle DB,但不太适合使用SQL/PL-SQL。
如果有人能给我指出正确的方向,我将不胜感激。

导出模式的元数据

exp userid=user/pass@db owner=someowner rows=n file=somefile.dmp
如果使用记事本打开文件,则可以看到DML语句。 然后可以使用

imp userid=user/pass@otherdb file=somefile.dmp full=y
您还可以复制到同一数据库上的另一个架构(通常用于测试)

您还可以使用新的数据泵进行并行和压缩增强。
签出

如果将其保存为脚本,然后在SQL*Plus下执行,则此操作将有效。这些表通过
TABLE_999
命名为
TABLE_000
,列的顺序类似于
000
999

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
脚本的前几行输出如下所示:

CREATE TABLE TABLE_000 (  T000_COL_000 VARCHAR2(1),
  T000_COL_001 VARCHAR2(1),
  T000_COL_002 VARCHAR2(1),
  T000_COL_003 VARCHAR2(1),
... 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
试一试,你应该能够根据自己的具体需要调整它


附录尼古拉询问如何改变栏目类型,答案太长,无法放入评论中

要改变列类型,请在查询中显示
|| |'VARCHAR2(1)| |
的部分,并将其替换为数据类型逻辑。例如,如果列0-599为
VARCHAR2
,列600-899为
NUMBER
,列900-999为
DATE
,请将脚本更改为如下内容:

CREATE TABLE TABLE_000 (  T000_COL_000 VARCHAR2(1),
  T000_COL_001 VARCHAR2(1),
  T000_COL_002 VARCHAR2(1),
  T000_COL_003 VARCHAR2(1),
... 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

我突出显示了带有注释的
案例
语句。如果您将数据类型逻辑放在
案例
结尾
之间,您应该会很好。

非常感谢!我在自定义脚本时遇到困难,您是否有一些有用的链接,我可以从中学习语法。我必须有三种类型的列数据(varchar2、date、number),但我不能编写没有错误的列数据。这让我觉得自己很愚蠢,听起来很简单。@NikolaB-这远不简单,所以不要觉得自己很愚蠢。我认为你在网上找不到任何有针对性的帮助,所以我更新了我的答案。查看末尾的“附录”以获得有关更改数据类型的帮助。