【问题标题】:How to execute oraenv script using java program?如何使用java程序执行oraenv脚本?
【发布时间】:2018-05-15 13:46:46
【问题描述】:

如何使用java程序执行oraenv脚本?我如何从 Linux 终端执行。

 [oracle@DeltaLinOraASM2 tmp]$ . oraenv
 ORACLE_SID = [oracle] ? deltaasm
 The Oracle base has been set to /u01/app/oracle
 [oracle@DeltaLinOraASM2 tmp]$

我的oraenv 脚本文件包含以下内容:

export ORACLE_HOME=/opt/oracle/product/12.2.0.1/dbhome_1
export PATH=$PATH:$ORACLE_HOME/bin
export ORACLE_SID=deltaasm

如何使用java程序执行oraenv文件。

它在问 ORACLE_SID= 吗?执行脚本后。但是从程序中它没有被执行。

public class App2 {

public static String RunLinuxGrepCommand(String command) {
    String line = null;
    String strstatus = "";
    try {

        String[] cmd = { "/bin/sh", "-c", command };
        Process p = Runtime.getRuntime().exec(cmd);
        BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
        while ((line = in.readLine()) != null) {
            strstatus = line;
        }
        in.close();
    } catch (Exception e) {

        StringWriter sw = new StringWriter();
        PrintWriter pw = new PrintWriter(sw);
        e.printStackTrace(pw);
        pw.flush();
        String stackTrace = sw.toString();
        int lenoferrorstr = stackTrace.length();
        if (lenoferrorstr > 500) {
            strstatus = "Error:" + stackTrace.substring(0, 500);
        } else {
            strstatus = "Error:" + stackTrace.substring(0, lenoferrorstr - 1);

        }
    }
    System.out.println("strstatus" + strstatus);
    return strstatus;

}

public static void main(String[] args) throws IOException {

    String str = ". oraenv ; deltaasm ";
    App2.RunLinuxGrepCommand(str);

}
}

【问题讨论】:

    标签: java linux oracle shell unix


    【解决方案1】:

    您需要了解在 Java 中使用 exec 时会发生什么:

    1. 创建了一个新的外部进程。
    2. 进程执行你给的命令
    3. 进程退出。

    例如,如果你这样做:

      exec(". oraenv");
      exec("someOracleCommand");
    

    会发生什么:

    1. 创建了第一个进程。
    2. 第一个进程为该进程执行“.oraenv”设置环境变量
    3. 第一个进程退出。
    4. 创建了第二个进程。
    5. 第二个进程使用默认环境执行“someOracleCommand”。
    6. 第二个进程退出。

    看到问题了吗?环境变量设置不会从第一个进程传递到第二个进程。

    其实我上面说的不是真的。像这样运行“.oraenv”在任何情况下都行不通。这 ”。” command 是内置的 shell,除非您正在运行 shell,否则它不可用。上面没有做。 exec(". orenv") 将失败。

    解决方案:您需要在同一个 shell 中运行. oraenv 和命令,如下所示:

      exec("/bin/bash", "-c",
           ". oraenv ; someOracleCommand");
    

    我们所做的是将shell命令序列放在一行中,然后将其传递给shell执行。 shell 了解如何解析命令序列......并将在 shell 的环境中设置环境变量,以便它们可用于在 shell 中运行的以下命令。

    【讨论】:

    • 如果不想被提示,在执行'. oraenv'。
    • 好点。我不熟悉 oraenv 脚本实际上在做什么。 (另一种选择是修改您的 oraenv 脚​​本以包含这些设置。)
    • 您好 Stephen C,感谢您的帮助。
    • 我按照您的指导尝试了这种方式,但无法设置 ORACLE_SID
    • 要么在您执行的命令行中包含相关的 shell 命令(参见 Mark 的注释),要么将它们编辑到 oraenv 脚本中。
    猜你喜欢
    • 2016-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-18
    • 2015-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多