将数据从一个 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;
它解决了问题。
我有两个相同的 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;
它解决了问题。