【问题标题】:ORA-00997: illegal use of LONG datatype: while creating a table with select statementORA-00997: 非法使用 LONG 数据类型: 在使用 select 语句创建表时
【发布时间】:2023-04-04 12:42:01
【问题描述】:

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

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

Ora1 中的表 tab1 具有 LONG 数据类型的列,因此在 ora2 中使用以下语法创建表 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 数据类型”。

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

【问题讨论】:

  • 你可以在源模式中创建一个视图,你已经在其中进行了投射到 lob 吗? stackoverflow.com/questions/29116396/…, stackoverflow.com/questions/29853945/…,
  • 您的意思是向 TO_LOB 传递表名吗?还是您的 LONG 列的名称与表格相同?
  • 真正的问题是:你为什么还在使用LONG 数据类型?这在 15 年前已被弃用。
  • @BobJarvis 请原谅,我的意思是具有表 tab1 的 LONG 数据类型的特定列

标签: sql oracle oracle11g sqldatatypes sqllong


【解决方案1】:

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

一种选择是在远程数据库上进行 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;
/

【讨论】:

  • 我可以用第二个块完成它。但发现第一个匿名块很难。创建表“dbms_utility.exec_ddl_statement@dblink_nm('create table temp_lob_results as select to_lob(a) a from tab1');”
  • @Pooja 错误信息是什么?您可能想先尝试直接在远程数据库上运行该命令以确定确切的语法,然后在远程调用中使用该语句。
猜你喜欢
  • 1970-01-01
  • 2015-05-20
  • 1970-01-01
  • 2013-10-13
  • 2015-07-03
  • 1970-01-01
  • 2017-05-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多