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

标签 mysql sql database oracle

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

例子

create table table_to_copy
as
select * from table_to_copy@DBLINK;

"oracle sql error ora-00997 illegal use of long datatype"


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

请注意

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

请帮忙,您的专家意见对我来说非常有值(value)。

注意:这里还有一些其他问题可能看起来类似 Illegal use of LONG datatype Oracle 但他们没有我正在寻找的解决方案。

最佳答案

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

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;

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

关于mysql - 将 Mysql 表复制到 Oracle 时非法使用 LONG 数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41243481/

相关文章:

database - 如何仅当 hdfs 中有文件时才执行命令

sql - 使用 sqlplus 设置要返回的最大行数

java - 如何使用 Mybatis 将 JavaBean 包含列表保存到 Sql?

php - 自动完成 2 个查询

mysql从另一列中选择列值

php - 是否可以将 IF NOT EXIST 与 INSERT 语句一起使用,在其中插入可变数量的行?

php - 在 MySQL/PHP 中进行近似搜索匹配的最佳方法?

sql - JSON 扁平化和表创建

php - MYSQL 检索特色图片和帖子标题

php - Eloquent 获取与模型 X 关联的所有模型