状况:
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

解决方案 »

  1.   


    SELECT CAST('123' AS VARCHAR2(10)) FROM DUAL;
      

  2.   

    谢谢,ziwen00!使用 CAST 函数后:
    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:
      

  3.   

    应为 NUMBER, 但却获得 LONG这个貌似应该是ID列出现的错误吧?
      

  4.   


    不是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;查询时,是无法查到数据的。
      

  5.   

    如果是一次性任务的话:尝试一下使用PL/SQL developer自带的odbc工具让工具替你导入.如果不是一次性任务的话:那就再尝试一下使用varchar(MAX)、nvarchar(MAX)
      

  6.   


    不是一次性任务,需要每天执行且数据量大,还要考虑效率;
    现在就是用存储过程,使用fetch,从mssql抓取数据,通过变量转换后,然后在一笔笔将数据插入oracle中,但效率太低,而且数据量大时,oracle会内存溢出报错。
      

  7.   

    必须要做转换 ,有个帖子可参考下http://www.cnblogs.com/tippoint/archive/2012/10/29/2744539.html