我必须创建一个脚本,该脚本创建必须具有1.000个表的架构,其中包含1.000列。 表名(示例):TABLE_058 列名(示例):T058_COL_078
表格应为空。我正在使用Oracle DB,并且不太适合使用SQL / PL-SQL。 如果有人指出我正确的方向,那将是非常有必要的。
答案 0 :(得分:2)
如果您将其另存为脚本然后在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
之间,那么您应该没问题。
答案 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