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