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;
/