ORA-00997: 非法使用 LONG 数据类型: 在使用 select 语句创建 table 时
ORA-00997: illegal use of LONG datatype: while creating a table with select statement
ORA-00997: illegal use of LONG datatype
我在 Oracle 中的两个数据库 Ora1 和 Ora2 之间创建了一个 dblink。
Ora1 中的 table tab1 具有 LONG 数据类型的列,因此在使用以下语法在 ora2 中创建 table tab2 时:
create table Ora2.tab2 as select tab1 from Ora1.tab1@dblink_nm;
给出了"ORA-00997: illegal use of LONG datatype"
的错误
所以我尝试将 tab1 转换为 LOB。使用以下语法:
create table Ora2.tab2 as select TO_LOB(tab1) from Ora1.tab1@dblink_nm;
但我仍然面临同样的问题"ORA-00997: illegal use of LONG datatype"。
是否有任何替代方法来处理数据并创建 table?
总有一种方法可以在数据库中移动数据link,但某些数据类型需要多个步骤。
一种选择是在远程数据库上进行 LONG 到 LOB 的转换,将转换后的数据复制过来,然后清理中间部分 table:
begin
dbms_utility.exec_ddl_statement@dblink_nm('create table temp_lob_results as select to_lob(a) a from tab1');
execute immediate 'create table tab2 as select * from temp_lob_results@dblink_nm';
dbms_utility.exec_ddl_statement@dblink_nm('drop table temp_lob_results');
end;
/
另一种选择是使用PL/SQL,它可以将 LONG 隐式转换为 LOB。 (通常像这样使用 PL/SQL 是一个可怕的想法,因为它太慢而且
比单个 SQL 语句更复杂。)
--create table tab2(...);
begin
for tab1_rows in
(
select * from tab1@dblink_nm
) loop
insert into tab2 values(tab1_rows.a);
end loop;
end;
/
ORA-00997: illegal use of LONG datatype
我在 Oracle 中的两个数据库 Ora1 和 Ora2 之间创建了一个 dblink。
Ora1 中的 table tab1 具有 LONG 数据类型的列,因此在使用以下语法在 ora2 中创建 table tab2 时:
create table Ora2.tab2 as select tab1 from Ora1.tab1@dblink_nm;
给出了"ORA-00997: illegal use of LONG datatype"
的错误所以我尝试将 tab1 转换为 LOB。使用以下语法:
create table Ora2.tab2 as select TO_LOB(tab1) from Ora1.tab1@dblink_nm;
但我仍然面临同样的问题"ORA-00997: illegal use of LONG datatype"。
是否有任何替代方法来处理数据并创建 table?
总有一种方法可以在数据库中移动数据link,但某些数据类型需要多个步骤。
一种选择是在远程数据库上进行 LONG 到 LOB 的转换,将转换后的数据复制过来,然后清理中间部分 table:
begin
dbms_utility.exec_ddl_statement@dblink_nm('create table temp_lob_results as select to_lob(a) a from tab1');
execute immediate 'create table tab2 as select * from temp_lob_results@dblink_nm';
dbms_utility.exec_ddl_statement@dblink_nm('drop table temp_lob_results');
end;
/
另一种选择是使用PL/SQL,它可以将 LONG 隐式转换为 LOB。 (通常像这样使用 PL/SQL 是一个可怕的想法,因为它太慢而且 比单个 SQL 语句更复杂。)
--create table tab2(...);
begin
for tab1_rows in
(
select * from tab1@dblink_nm
) loop
insert into tab2 values(tab1_rows.a);
end loop;
end;
/