ORA-00997 的解决方法:非法使用 LONG 数据类型
Posted
技术标签:
【中文标题】ORA-00997 的解决方法:非法使用 LONG 数据类型【英文标题】:Workaround for ORA-00997: illegal use of LONG datatype 【发布时间】:2015-05-20 21:40:27 【问题描述】:我想将系统表 user_tab_cols 中的一些数据保存到临时表中,以便从中进行转储。
其中有 100,000 行,我从 user_tab_cols 中选择了大约 1,000 条记录,并使用此查询将它们保存到临时表中:
create table temp table as
select * from user_tab_cols where condition...
我有错误 'illegal use of longtype' ,因为 DATA_DEFAULT 列包含 long 类型。
是否有替代方法可以将长类型存储到另一个表中?
【问题讨论】:
long
s 是极其有限的类型。您没有使用CLOB
s 有什么特别的原因吗?
@Mureinik 我正在从 user_tab_cols 中提取一些包含 long 列的数据,有没有办法提取这些数据?
没有注册表名...代表我这是一个愚蠢的问题。过错。
使用 TO_LOB 将其转换为 CLOB。看我的回答。
SQL*Plus COPY 命令可能会有所帮助——之前通过 DB Link 将它用于 Oracle-to-Oracle,用于包含 LONG 的表。我不知道它是否适用于 mysql-to-Oracle。其他替代方法可能是查看 Java 存储过程以打开与远程数据库的连接并获取数据然后在本地插入。
【参考方案1】:
ORA-00997: 非法使用 LONG 数据类型
这是对 LONG 数据类型使用的限制。 您不能创建具有 LONG 属性的对象类型。
SQL> CREATE TABLE t AS SELECT data_default FROM user_tab_cols;
CREATE TABLE t AS SELECT data_default FROM user_tab_cols
*
ERROR at line 1:
ORA-00997: illegal use of LONG datatype
SQL>
或者,您可以使用 TO_LOB 作为解决方法。这会将其转换为 CLOB 数据类型。
例如,
SQL> CREATE TABLE t AS SELECT TO_LOB(data_default) data_default FROM user_tab_cols;
Table created.
SQL> desc t;
Name Null? Type
----------------------------------------- -------- ----------------------------
DATA_DEFAULT CLOB
SQL>
查看更多解决方法示例here。
【讨论】:
【参考方案2】:您需要显式创建目标表,而不是从select *
:
create table demo_copy
( table_name varchar2(30)
, column_name varchar2(30)
, data_type varchar2(106)
, data_type_mod varchar2(3)
, data_type_owner varchar2(30)
, data_length number
, data_precision number
, data_scale number
, nullable varchar2(1)
, column_id number
, default_length number
, data_default clob
, num_distinct number
, low_value raw(32)
, high_value raw(32)
, density number
, num_nulls number
, num_buckets number
, last_analyzed date
, sample_size number
, character_set_name varchar2(44)
, char_col_decl_length number
, global_stats varchar2(3)
, user_stats varchar2(3)
, avg_col_len number
, char_length number
, char_used varchar2(1)
, v80_fmt_image varchar2(3)
, data_upgraded varchar2(3)
, hidden_column varchar2(3)
, virtual_column varchar2(3)
, segment_column_id number
, internal_column_id number
, histogram varchar2(15)
, qualified_col_name varchar2(4000) );
(为了更方便查询,我将data_default
设为clob
。)
然后您可以在 PL/SQL 循环中插入行:
begin
for r in (
select * from user_tab_cols c
where rownum <= 2 -- your filter condition here
)
loop
insert into demo_copy values r;
end loop;
end;
这种方法在原则上存在一些限制,因为long
列可以容纳比 PL/SQL 将在循环中使用的varchar2(32760)
更多的内容。不过,我预计 32K 对于大多数列默认表达式来说已经足够了。
【讨论】:
以上是关于ORA-00997 的解决方法:非法使用 LONG 数据类型的主要内容,如果未能解决你的问题,请参考以下文章
当我尝试在 laravel 中更新数据透视表的内容时,有啥方法可以解决非法偏移类型错误