我必须加载一个文件名包含@符号的文件。
我正从我的java类调用sql loader。
目前,当我尝试在文件名中加载带@符号的文件时,sql加载程序无法加载该文件。
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
讨论转义@登录密码,但是如果它在文件名中,是否可以转义@符号?
谢谢。
答案 0 :(得分:1)
@
被解释为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;除非他们可以暂时远程连接,即使他们通常不需要。
这些示例是从shell运行SQL * Loader。在Java中,您可以在设置其他环境变量的同时设置ORACLE_SID:
String[] env = new String[]
{
"ORACLE_SID=@",
"ORACLE_HOME="+oracleHome,
"LD_LIBRARY_PATH="+oracleLibPath+":"+oracleLib32Path+":$LD_LIBRARY_PATH"
};
...并使用您原来的cmd
值。