从java调用SQLLoader,发出加载名称包含@ -signs的文件

时间:2014-11-17 14:01:13

标签: java sql oracle sql-loader

我必须加载一个文件名包含@符号的文件。

我正从我的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

讨论转义@登录密码,但是如果它在文件名中,是否可以转义@符号?

谢谢。

1 个答案:

答案 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值。