1

我必须制作一个脚本来创建必须有 1.000 个表和 1.000 列的模式。表名(示例):TABLE_058 列名(示例):T058_COL_078

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

4

2 回答 2

2

如果您将其保存为脚本,然后在 SQL*Plus 下执行,这将起作用。表通过 命名TABLE_000TABLE_999列通过 类似地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

需要注意的一些事项:

  • 编号方案是从 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用评论突出显示了该声明。如果你把你的数据类型逻辑放在CASE和之间END你应该没问题。

于 2013-04-09T11:57:44.687 回答
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

您还可以使用新的数据泵进行并行和压缩增强。看看这个链接

于 2013-04-09T11:56:35.617 回答