ORA-00997:非法使用LONG数据类型:使用select语句创建表

时间:2017-06-30 14:48:46

标签: sql oracle oracle11g sqldatatypes sqllong

  

ORA-00997:非法使用LONG数据类型

我在Oracle中在两个数据库Ora1&之间创建了一个dblink。 Ora2。

Ora1中的表tab1具有LONG数据类型的列,因此在ora2中使用以下sybntax创建表tab2时:

create table Ora2.tab2 as select tab1 from Ora1.tab1@dblink_nm; 

给出错误“ORA-00997:非法使用LONG数据类型”

所以我尝试将tab1转换为LOB。语法如下:

create table Ora2.tab2 as select TO_LOB(tab1) from Ora1.tab1@dblink_nm; 

但我仍面临同样的问题“ORA-00997:非法使用LONG数据类型”。

是否有替代方法来处理数据并创建表格?

1 个答案:

答案 0 :(得分:0)

总是可以通过数据库链接移动数据,但某些数据类型需要多个步骤。

一个选项是在远程数据库上执行LONG到LOB转换,复制转换后的数据,然后清理中间表:

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