状况:
DB Server 2台:一台Oracle,一台SQL Server 2008;
需求是从SQL Server的表中查询数据,并插入 Oracle 数据库中;主要问题:
SQL Server 中的部分数据类型在Oracle中是没有相应数据类型时,Oracle报错。
参考SQL为: INSERT INTO a_table
SELECT "Id","Memo" FROM b_table@SQLDB;执行后报错:ORA-00997
其中a_table,2个字段: "ID" VARCHAR2(50 BYTE),
"MEMO" VARCHAR2(4000 BYTE)其中b_table,2个字段: "ID" VARCHAR2(50 BYTE),
"MEMO" text即SQL SERVER所对应的 text字段无法被ORACLE接受
同时尝试其它数据类型将a_table的memo字段调整为blob,clob,均会报该错误。
这个问题可以使用过度变量,逐行查询转换来解决该问题,但因要抓取的数据量非常大,这样会导致效率比较低。
也尝试在语句中加入转换函数,to_char,to_clb,但都不可以转换。所以SQL Server的text字段,在Oracle中使用哪种数据类型或通过什么函数可以转换?OracleDBLINKSQL ServerSQL
DB Server 2台:一台Oracle,一台SQL Server 2008;
需求是从SQL Server的表中查询数据,并插入 Oracle 数据库中;主要问题:
SQL Server 中的部分数据类型在Oracle中是没有相应数据类型时,Oracle报错。
参考SQL为: INSERT INTO a_table
SELECT "Id","Memo" FROM b_table@SQLDB;执行后报错:ORA-00997
其中a_table,2个字段: "ID" VARCHAR2(50 BYTE),
"MEMO" VARCHAR2(4000 BYTE)其中b_table,2个字段: "ID" VARCHAR2(50 BYTE),
"MEMO" text即SQL SERVER所对应的 text字段无法被ORACLE接受
同时尝试其它数据类型将a_table的memo字段调整为blob,clob,均会报该错误。
这个问题可以使用过度变量,逐行查询转换来解决该问题,但因要抓取的数据量非常大,这样会导致效率比较低。
也尝试在语句中加入转换函数,to_char,to_clb,但都不可以转换。所以SQL Server的text字段,在Oracle中使用哪种数据类型或通过什么函数可以转换?OracleDBLINKSQL ServerSQL
SELECT CAST('123' AS VARCHAR2(10)) FROM DUAL;
SQL语句: INSERT INTO a_table
SELECT "Id",CAST("Memo" AS VARCHAR2(4000))FROM b_table@SQLDB;
或单独执行:
SELECT "Id",CAST("Memo" AS VARCHAR2(4000))FROM b_table@SQLDB;
均报如下错误:ORA-00932: 数据类型不一致: 应为 NUMBER, 但却获得 LONG
00932. 00000 - "inconsistent datatypes: expected %s got %s"
*Cause:
*Action:
不是ID列的问题,是memo列的问题,是oracle把sqlserver的text识别为long。
如果使用CREATE OR REPLACE VIEW v_b_table
AS
SELECT * FROM b_table@SQLDB
WITH Read Only; 然后用
desc v_b_table时,看到memo的数据类型为long,并且使用语句select * from v_b_table;查询时,是无法查到数据的。
不是一次性任务,需要每天执行且数据量大,还要考虑效率;
现在就是用存储过程,使用fetch,从mssql抓取数据,通过变量转换后,然后在一笔笔将数据插入oracle中,但效率太低,而且数据量大时,oracle会内存溢出报错。