具有Unicode文件名的Oracle外部表

时间:2013-12-12 13:01:32

标签: oracle oracle11g

任何人都可以帮我解决这个特殊的错误。我在hindi中有一个单独的文件名,我正在创建一个外部目录。外部目录创建的命令完成没有任何错误,但是当我查询表时它会抛出以下错误

An error occurred when executing the SQL command:
select * from EXT_TABLE_13868
ORA-29913: error in executing ODCIEXTTABLEOPEN callout
ORA-29400: data cartridge error
KUP-04040: file येश.txt.tmp in EXTDIR_13868 not found [SQL State=99999, DB Errorcode=29913] 

外部表创建脚本

CREATE TABLE EXT_TABLE_13868(cols..)
ORGANIZATION EXTERNAL (
TYPE ORACLE_LOADER
DEFAULT DIRECTORY EXTDIR_13868
ACCESS PARAMETERS (
RECORDS DELIMITED BY '\r\r\n' CHARACTERSET 'UTF16'
BADFILE EXTDIR_13868:'BAD.txt.bad'
LOGFILE EXTDIR_13868:'LOG.txt.log'
FIELDS TERMINATED BY '|' OPTIONALLY ENCLOSED BY '"'
MISSING FIELD VALUES ARE NULL)
LOCATION ('येश.txt.tmp')
)REJECT LIMIT 0

数据库字符集

 PARAMETER  VALUE
    NLS_LANGUAGE    AMERICAN
    NLS_TERRITORY   AMERICA
    NLS_CURRENCY    $
    NLS_ISO_CURRENCY    AMERICA
    NLS_NUMERIC_CHARACTERS  .,
    NLS_CHARACTERSET    AL32UTF8
    NLS_CALENDAR    GREGORIAN
    NLS_DATE_FORMAT DD-MON-RR
    NLS_DATE_LANGUAGE   AMERICAN
    NLS_SORT    BINARY
    NLS_TIME_FORMAT HH.MI.SSXFF AM
    NLS_TIMESTAMP_FORMAT    DD-MON-RR HH.MI.SSXFF AM
    NLS_TIME_TZ_FORMAT  HH.MI.SSXFF AM TZR
    NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
    NLS_DUAL_CURRENCY   $
    NLS_COMP    BINARY
    NLS_LENGTH_SEMANTICS    BYTE
    NLS_NCHAR_CONV_EXCP FALSE
    NLS_NCHAR_CHARACTERSET  AL16UTF16
    NLS_RDBMS_VERSION   11.2.0.2.0

请注意,如果文件名保存在ANSI中,那么即使文件内容具有单一编码数据,相同的过程也不会有任何问题。这是导致问题的unicode文件名。

1 个答案:

答案 0 :(得分:0)

有趣的问题。我无法重现:

create directory test_dct
as
'...'
/
create table test_table
( a varchar2(2000)
)
organization external 
( type oracle_loader
  default directory test_dct
  access parameters 
  ( records delimited by ',' characterset 'AL32UTF8'
    badfile test_dct:'test.bad'
    logfile test_dct:'test.log'
    fields terminated by '|' 
    optionally enclosed by '"'
    missing field values are null
  )
  location ('येश.tmp')
) 
reject limit 0
/

在档案中有:

a,b,c,d,e,f

这会整齐地返回6行:

select *
from   test_table
/

适用于Linux上的11.2.0.3 SE1。您在Windows XP / 7和XE上运行11.2.0.2。差异可以是配置,网络,软件或操作系统。

我在v $ nls_parameters中的配置对于nls_characterset和nls_length_semantics是相同的(这不太可能导致问题,但有时Oracle的内核开发人员就像人一样,他们选择了错误的配置设置)。我不认为配置问题是原因。

网络不是问题,因为在这种情况下,Oracle网络驱动程序不会在任何地方使用。所以映射不适用。

软件版本几乎相同(11.2.0.2和11.2.0.3)。我在网络中的任何地方都没有11.2.0.2,我记得在11.2.0.2和11.2.0.3之间我注意到的唯一区别是dbms_metadata包有缺陷并且解决了一些小的调优问题。 11.1的初始版本对于特定查询有一些主要的Unicode错误,但在11.2中没有类似的错误。所以我不认为这是原因。

版本XE和SE1不完全相同,但我不希望它出现问题。 Oracle Corp.需要维护一大块软件,并尽可能地共享代码。

最佳候选者是操作系统(或更好地说:操作系统和Oracle之间的关系)。

建议采取的行动:

  • 请检查您是否使用NTFS文件系统,该文件系统将文件名存储为Unicode。如果有的话,FAT文件系统并不总能很好地处理Unicode。
  • 当我在Oracle的操作系统问题上运行时,我喜欢稍微调试一下内核。与UNIX strace类似,您可以使用Oracle进程的确切操作的sysinternals获得更多信息。在首次打开外部文件时使用Process Explorer(可从here获得。)
  • 使用过滤器将大量输出限制为可读且相关的内容。
  • 在打开具有相同文件名的同一文件的副本时,将此输出与Notepad.exe或Winword.exe进程资源管理器输出进行比较。
  • 请注意要打开的文件。例如,可能存在非常相似的文件名,但附加了chr(0),空格或重写印地语字符。如有疑问,请在Proess Explorer的原始数据上使用hexeditor。当在www.invantive.co.in上开始时,我们也遇到了一些与文件名有关的问题。
  • 如果没有帮助,请尝试使用Linux和Oracle XE在下载的VMWare映像上重现并在此处发布结果。祝你好运!