将数据从一个 Oracle 数据库复制到另一个具有不同 Unicode 的数据库时出现 ORA-01406

ORA-01406 when copying data from one Oracle database to another with different Unicode

我有两个相同的 table:original_table,目标 table 在两个不同的 Oracle 数据库中。

-- Oracle 1
create table original_table
(
  my_id   NUMBER(11) not null,
  my_fld  CHAR(15),
)

-- Oracle 2
create table destination_table
(
  my_id   NUMBER(11) not null,
  my_fld  CHAR(15),
)

我正在使用过程和数据库 link 将数据从 original_table 复制到 destination_table。这是一个伪代码版本。

PROCEDURE COPY_DATA AS
BEGIN
    FOR c_cursor IN (SELECT my_id ,my_fld FROM original_table@dblink) 
    LOOP
        INSERT INTO destination_table 
        VALUES (c_cursor.my_id, c_cursor.my_fld);
    END LOOP; 
END;

有时,当在 original_table.my_fld 列中插入特殊字符时,Oracle 会抛出错误。

ORA-01406: 获取的列值被截断

这是因为这两个数据库具有不同的 Unicode,而我select正在 LOOP 中输入数据。我尝试在 LOOP 之外编写 select-insert 语句并且它工作正常。

你能告诉我如何解决这个问题吗?

如果您只想将所有数据从一个 table 复制到另一个,您不需要游标,您可以在过程中使用 sql 来完成。尝试一下希望它有所帮助...

PROCEDURE COPY_DATA AS
BEGIN
   INSERT INTO [database].[schema].destination_table (column_list)
   SELECT column_list
   FROM [database].[schema].original_table
   WHERE condition;
END;

Select 并插入数据 row-by-row 基本上是最慢的方法。使用这个:

INSERT INTO destination_table (my_id ,my_fld)
SELECT my_id ,my_fld 
FROM original_table@dblink;

我对我的字符串字段使用了 UNISTR 函数。

 FOR c_cursor IN (SELECT my_id ,UNISTR(my_fld) FROM original_table@dblink) 
    LOOP
        INSERT INTO destination_table 
        VALUES (c_cursor.my_id, c_cursor.my_fld);
    END LOOP; 

它解决了问题。