我必须创建一个脚本,该脚本创建必须具有1.000个表的1000个列的表。 表名称(示例):TABLE_058 列名称(示例):T058_COL_078用于自动创建数据库表的脚本
表格应该为空。我正在使用Oracle DB,并不太适合使用SQL/PL-SQL。 如果有人指出我的方向是正确的,那将是非常有必要的。
我必须创建一个脚本,该脚本创建必须具有1.000个表的1000个列的表。 表名称(示例):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/[email protected] owner=someowner rows=n file=somefile.dmp
如果使用记事本打开文件,您可以看到DML语句。 那么你可以导入使用
imp userid=user/[email protected] file=somefile.dmp full=y
你也可以复制到另一个模式在同一个数据库(通常用于测试)
imp userid=user/[email protected] file=somefile.dmp fromuser=someschema touser=otherschema
你也可以使用并行压缩增强新的数据泵。 检出this link
非常感谢!我在定制脚本时遇到了困难,你是否有一些有用的链接可以从中了解语法。我必须有三种类型的列数据(varchar2,日期,数字),但我不能写出没有错误。这让我感到很蠢,听起来很简单。 – NikolaB 2013-04-12 13:47:26
@NikolaB - 这远非简单,所以不要觉得笨拙。我不认为你会在网上找到任何有针对性的帮助,所以我已经更新了我的答案。查看最后的“附录”以获得有关改变数据类型的帮助。 – 2013-04-12 14:28:06