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

我从我的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值。

07-24 09:37
查看更多