代码之家  ›  专栏  ›  技术社区  ›  Keith

使用SQL加载器将LOB导入Oracle失败

  •  0
  • Keith  · 技术社区  · 15 年前

    我正在尝试从SQL Server导出一个表,该表由一个ID和一个存储为nvarchar(max)的非常长的XML字符串组成。

    SQL Table -- CREATE TABLE MyStuff (MyID int, MyText nvarchar(max))
    Oracle Table -- CREATE TABLE MyStuffImported (MyID int, MyText NCLOB)

    我正在使用SQL Server BCP实用工具导出到一个文本文件(mystuf.bcp),然后通过SQL加载程序导入到Oracle中。但SQL加载程序失败,并显示以下消息: “数据文件(mystuf.bcp)中的物理记录长于最大值(1048576)” 0条记录被导入。

    我不知道确切的问题是什么。最明显的可能性是mytext的长度超过了最大值1048576,实际上有些记录是,但不是全部,所以为什么至少有些记录没有被导入?有办法绕过这个限制吗?

    另一种可能是我在一些讨论板上读到的,在我的文本中有一些Oracle无法处理的换行符。我希望我已经解决了这个问题:(1)从SQL中导出时删除\r和\n;(2)在SQL加载器控制文件的记录分隔符中使用\n(有关完整文件,请参见下面)。我是否做了不正确的事情,或者没有处理所有的案件?

    这是我的SQL加载器控制文件的文本。请注意,我使用\作为分隔符,这看起来很奇怪,但它是mytext字段中唯一没有使用的字符。所以你会看到 \\ 我的意思是\因为我在逃避它。

    LOAD DATA  
    INFILE "MyStuff.bcp" "str '\\\n'"  
    APPEND INTO TABLE MyStuffImported  
    (  
     MyID INTEGER EXTERNAL TERMINATED BY "\\",  
     MyText CHAR TERMINATED BY "\\"  
    )
    

    有什么建议吗?也许有更好的方法通过SQL加载器导入到NCLOB中?

    2 回复  |  直到 8 年前
        1
  •  1
  •   Keith    8 年前

    我可以通过执行以下操作来解决问题:

    1)在sqlldr上设置readsize和bindsize参数以更改最大限制1048576(以绕过“数据文件中的物理记录…”大于最大“错误”)。
    2)在我的控制文件中,设置char的特定长度(以绕过“数据文件中的字段超过最大长度”错误)。见下文:

    LOAD DATA  
    INFILE "MyStuff.bcp" "str '\\\n'"  
    APPEND INTO TABLE MyStuffImported  
    (  
        MyID INTEGER EXTERNAL TERMINATED BY "\\",  
        MyText CHAR(10000000) TERMINATED BY "\\"  
    )
    
        2
  •  0
  •   Gandalf    15 年前

    我敢打赌您不会在每条记录之后提交,所以一旦您得到错误并且SQL加载器失败,它就会回滚您以前的插入。