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



我有两个相同的表:original_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),
)

我正在使用过程和数据库链接将数据从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会抛出ERROR。

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

这是因为这两个数据库有不同的Unicode,而我选择的是LOOP中的数据。我尝试在LOOP之外编写select insert语句,它运行良好。

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

我使用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; 

它解决了问题。

如果你只想将所有数据从一个表复制到另一个表,你不需要游标,你可以在过程中使用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;

逐行选择并插入数据基本上是最慢的方法

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

最新更新