SQL*Plus复制Oracle遗留LONG数据表

0 下载量 84 浏览量 更新于2024-09-03 收藏 28KB DOC 举报
"这篇文章主要探讨了如何利用SQL*Plus复制包含遗留Oracle数据表,特别是那些使用了已经被弃用的LONG和LONG RAW数据类型的表。在Oracle 8i及之后的版本,由于LOB数据类型的引入,LONG和LONG RAW不再推荐使用。然而,SQL*PLUS的COPY命令依然能有效地处理这些旧数据表的复制工作。" 在Oracle数据库中,LONG和LONG RAW数据类型原本用于存储大段文本数据,但在Oracle 8i及其后续版本中,为了更好地管理和处理大量数据,Oracle引入了Large Object(LOB)数据类型,如CLOB和BLOB,以替代LONG和LONG RAW。LOB数据类型提供了更高效、更灵活的存储方式,同时解决了LONG和LONG RAW的一些限制和问题。 然而,对于那些仍然使用LONG数据类型的老表,如果尝试使用CREATE TABLE AS SELECT语句进行复制,会遇到ORA-00997错误,提示非法使用LONG数据类型。在这种情况下,COPY命令就显得非常有用。COPY命令的格式如下所示,其中包含了源数据库连接信息、目标数据库连接信息、要创建的新表名以及用于复制数据的SELECT语句: ```sql COPY FROM user/pw@dblink TO user/pw@dblink CREATE table-name - USING select-statement; ``` 值得注意的是,Oracle 8.0版本后,COPY命令的功能被冻结,只能处理包含CHAR、DATE、LONG、NUMBER和VARCHAR2数据类型组成的表。而在Oracle 8i中,尽管增加了新的数据类型,COPY命令仍然沿用了旧的方式,无法处理新数据类型。这意味着如果你试图复制包含Oracle 8i后新增数据类型的表,COPY命令可能会失败。 示例中展示了如何使用COPY命令复制一个包含LONG数据类型的表`USER_VIEWS`。首先尝试使用CREATE TABLE AS SELECT语句会报错,然后通过设置SQL*Plus的LONG参数来指定LONG数据类型的大小,并使用COPY命令成功复制了表: ```sql SQL> SET LONG 100000 SQL> COPY FROM hr/hr@orcl CREATE my_views - > USING SELECT * FROM user_views; ``` 在这个例子中,`SET LONG 100000`设置了一个较大的LONG值,允许COPY命令处理更大的LONG数据。然后COPY命令执行,创建了一个名为`MY_VIEWS`的新表,并从`USER_VIEWS`中复制了数据。成功执行后,新表`MY_VIEWS`被创建,且所有行都被正确地插入。 总结来说,虽然LONG和LONG RAW数据类型在现代Oracle数据库中已不推荐使用,但SQL*Plus的COPY命令提供了一种有效的方式来处理这些遗留表的复制,特别是在需要一次性复制整个表结构和数据时,它是一个实用的工具。不过,需要注意的是,COPY命令对数据类型的支持有限,只适用于特定情况,对于更复杂的需求,可能需要采用其他方法,如数据泵(Data Pump)或者传统的EXP/IMP工具。