我必须制作一个脚本来创建必须有 1.000 个表和 1.000 列的模式。表名(示例):TABLE_058 列名(示例):T058_COL_078
表应该是空的。我正在使用 Oracle DB,不太适合使用 SQL/PL-SQL。如果有人能指出我正确的方向,将不胜感激。
如果您将其保存为脚本,然后在 SQL*Plus 下执行,这将起作用。表通过 命名TABLE_000
,TABLE_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
你应该没问题。
导出架构的元数据。
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
您还可以使用新的数据泵进行并行和压缩增强。看看这个链接