在将Mysql表复制到Oracle时非法使用LONG数据类型

Gou*_*v C 9 mysql sql database oracle

我有一个MySQL和一个Oracle服务器.我必须定期将一些表从MySQL复制到Oracle服务器,这是通过预定的PLSQL过程完成的,为此我在MySQL和Oracle之间创建了一个DBLINK.一切都工作正常,直到我不得不复制一个开始出错的表

create table table_to_copy
as
select * from table_to_copy@DBLINK;
Run Code Online (Sandbox Code Playgroud)

" oracle sql错误ora-00997非法使用long数据类型 "


我已经阅读了几条评论,这主要是因为隐式转换,大多数建议是执行显式的to_lob转换.但做任何手动都不是一个可行的选择.

请注意

  • 工作安排是这样的我没有任何访问MySQL服务器我唯一得到的是表名和DBLINK.所以我只能使用select语句来提取数据
  • 上述问题的解决方案必须在某种自动修复中处理.这是因为对于表复制的请求可以是任意给定点的数百个表,并且我无法通过所有表来手动修复/检查.

请帮助,您的专家评论对我来说非常有价值.

注意:这里还有一些其他问题可能类似于 非法使用LONG数据类型Oracle, 但它们没有我想要的解决方案.

Ste*_*len 1

我意识到这已经很晚了,而且我没有这个确切的设置。然而,我从Oracle(11gR2)到SQL Server(2008R2及更早版本)所做的就是通过数据库链接读取INFORMATION_SCHEMA.COLUMNS,然后动态生成一个字符串以在PL/SQL中EXECUTE IMMEDIATE。

DECLARE
  TYPE associative_array IS TABLE OF VARCHAR2(100) INDEX BY VARCHAR2(50);

  data_type_tranforms associative_array;
  dynamicSQL varchar2(32767);
  column_list varchar2(32767) := '';
  expressions varchar2(32767) := '';

  FUNCTION apply_transform(column_name VARCHAR2, data_type VARCHAR2) RETURN VARCHAR2 AS
    transformed VARCHAR2(1000);
  BEGIN
    IF data_type_transforms.exists(data_type) THEN
      transformed :=  replace(data_type_transforms(data_type),'$$',column_name);
    ELSE
      transformed := column_name;
    END IF;
    RETURN transformed;
  END apply_transform;

  FUNCTION strip_last_character(input VARCHAR2) RETURN VARCHAR2 AS
    /* Remove the delimiter trailing after the last entry */
  BEGIN
    RETURN SUBSTR(input, 1, LENGTH(input) - 1);
  END strip_last_character;

BEGIN
  data_type_transforms('LONG') := 'to_lob($$)';

  FOR col IN (
    SELECT column_name
      ,data_type
    FROM information_schema.columns@DBLINK
    WHERE table_name = 'TABLE_TO_COPY'
    ORDER BY ordinal_position
  ) LOOP
    column_list := column_list || col.column_name ||',';
    expressions := expressions || apply_transform(col.column_name, col.data_type) ||','; 
  END LOOP;
  dynamicSQL := 'INSERT INTO table_to_copy ('||
    strip_last_character(column_list)||
    ') SELECT '||
    strip_last_character(expressions)||
    ' FROM table_to_copy@DBLINK';

  EXECUTE IMMEDIATE dynamicSQL;
END;
Run Code Online (Sandbox Code Playgroud)

我在 PL/SQL 索引数组中保存了一系列模板,其中索引是一种数据类型,值是一个表达式,'to_date(''$$'',''YYYYMMDD'')'其中字符$$被替换为列名。如果您需要完全删除数据类型(我经常这样做),我只需在数据类型数组中放入一个空字符串即可。