gpt4 book ai didi

java - 从 java 调用 SQLLoader,加载名称包含 @ 符号的文件时出现问题

转载 作者:行者123 更新时间:2023-12-01 12:16:24 24 4
gpt4 key购买 nike

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

我正在从我的 java 类调用 sql 加载器。

当前,当我尝试加载文件名中包含 @ 符号的文件时,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

其中讨论了密码中的@符号的转义,但是如果文件名中存在@符号,是否可以转义@符号?

谢谢。

最佳答案

@ 被解释为 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 值。

关于java - 从 java 调用 SQLLoader,加载名称包含 @ 符号的文件时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26974366/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com