我必须加载一个文件名,其中包含@符号。
我从我的java类调用sql loader。
当前,当我尝试加载文件名中带有@符号的文件时,sql loader无法加载该文件。
SqlLoader日志说:-
SQL * Loader-503:将扩展名附加到文件(/FileWith@Symbol.csv)时出错
SQL * Loader-567:无法导出文件名
SQL * Loader-509:系统错误:错误0
发送到SqlLoader的命令如下
String[] cmd = new String[]
{
sqlldrPath ,
user + "/" + password + "@" + sid,
"control=" + file.getAbsolutePath(),
"direct=true",
"log=" + log.getAbsolutePath() + File.separator
+ lr.getTempTable() +".log"};
String[] env = new String[]
{
"ORACLE_HOME="+oracleHome,
"LD_LIBRARY_PATH="+oracleLibPath+":"+oracleLib32Path+":$LD_LIBRARY_PATH"
};
使用上述cmd和env字符串数组在此处调用SqlLoader。
Process p = Runtime.getRuntime().exec(cmd, env);
我发现SQLLoader with a password that contains @-signs
其中讨论了转义@登录密码,但是如果文件名中包含@登录,是否可以转义?
谢谢。
最佳答案
@
被解释为the ORACLE_SID value;如果未设置该环境变量,则会收到此错误。如果已设置,则将变量值插入控制文件名中。如果您的控制文件名为s@ntosh.ctl
,则会看到:
$ export ORACLE_SID=XE; sqlldr user/password s@ntosh.ctl
SQL*Loader: Release 11.2.0.3.0 - Production on Mon Nov 17 16:32:59 2014
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
SQL*Loader-500: Unable to open file (sXEntosh.ctl)
SQL*Loader-553: file not found
SQL*Loader-509: System error: No such file or directory
如果您的控制文件具有更普通的名称,但数据文件使用
@
指定,则会看到:$ export ORACLE_SID=XE; sqlldr user/password santosh.ctl
SQL*Loader: Release 11.2.0.3.0 - Production on Mon Nov 17 16:33:23 2014
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
SQL*Loader-500: Unable to open file (/FileWithXESymbol.csv)
SQL*Loader-553: file not found
SQL*Loader-509: System error: No such file or directory
SQL*Loader-2026: the load was aborted because SQL Loader cannot continue.
请注意,在两种情况下,
@
都简单地用XE
代替。既然您看到了:SQL*Loader-503: Error appending extension to file (/FileWith@Symbol.csv)
...这意味着您根本没有设置ORACLE_SID,大概是因为您正在远程访问数据库。这很方便,因为您可以将ORACLE_SID临时设置为
@
符号,以便将其扩展为同一对象:$ export ORACLE_SID=@; sqlldr user/password santosh.ctl
SQL*Loader: Release 11.2.0.3.0 - Production on Mon Nov 17 16:34:37 2014
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
SQL*Loader-500: Unable to open file (/FileWith@Symbol.csv)
SQL*Loader-553: file not found
...但是那是因为我实际上没有一个具有该名称的文件;与现有文件一起工作。您甚至可以在文件名中包含多个
@
符号。当然,这种解决方法对于在本地访问其数据库的任何人都无济于事,因为他们将依靠正确设置的ORACLE_SID来进行操作。除非他们通常不需要,但他们可以暂时进行远程连接。
这些示例从外壳运行SQL * Loader。在Java中,您可以在设置其他环境变量的同时设置ORACLE_SID:
String[] env = new String[]
{
"ORACLE_SID=@",
"ORACLE_HOME="+oracleHome,
"LD_LIBRARY_PATH="+oracleLibPath+":"+oracleLib32Path+":$LD_LIBRARY_PATH"
};
...并使用原始的
cmd
值。