zoukankan      html  css  js  c++  java
  • java调用sqlldr报错:Message 2100 not found

    java调用Oracle的sqlldr命令报错:Message 2100 not found; No message file for product=RDBMS, facility=ULMessage 2100 not found; No message file for product=RDBMS, facility=UL

    手动执行sqlldr 可以正常执行,但放在java中 就会报上面的2100的错。

    找错误找了两天。

    希望能帮助并记录这个问题。

    在这里整理解决办法(两种)(先说自己的,然后总结下百度到的)。

    1.先说下我遇到的问题

    先说结论:手动可以执行sqlldr,但再java中则需要设置环境变量。(本人不太懂Java,至少我这样设置后问题就解决了)

    网上查到的 Runtime.getRuntime().exec(cmd) 这个行代码就可以执行sqlldr,方法没错,只不过好像都没有写 还需要设置环境变量。

    String[] cmd = { "/bin/bash", "-c", "echo $ORACLE_HOME;echo $LD_LIBRARY_PATH;$ORACLE_HOME/bin/" + shellCommand };
    
    final Process pid = Runtime.getRuntime().exec(cmd,new String[] { "ORACLE_HOME=/oracle/app/oracle/product/11.2.0.4/dbhome/",
                "LD_LIBRARY_PATH=/usr/local/lib:/oracle/app/oracle/product/11.2.0.4/dbhome/lib:$LD_LIBRARY_PATH" });
                Process pid = Runtime.getRuntime().exec(cmd
                System.out.println("Process pid" + pid);
                bufferedReader = new BufferedReader(new InputStreamReader(pid.getErrorStream()), 1024);

    加上这几行就可以了。

    全代码如下:

    public static int executeShellsetHome(String shellCommand) {
            int success = -1;
            BufferedReader bufferedReader = null;
            String[] cmd = { "/bin/bash", "-c", "echo $ORACLE_HOME;echo $LD_LIBRARY_PATH;$ORACLE_HOME/bin/" + shellCommand };
            try {
                System.out.println("执行  executeShellsetHome");
                final Process pid = Runtime.getRuntime().exec(cmd,new String[] { "ORACLE_HOME=/oracle/app/oracle/product/11.2.0.4/dbhome/",
                "LD_LIBRARY_PATH=/usr/local/lib:/oracle/app/oracle/product/11.2.0.4/dbhome/lib:$LD_LIBRARY_PATH" });
                Process pid = Runtime.getRuntime().exec(cmd
                System.out.println("Process pid" + pid);
                bufferedReader = new BufferedReader(new InputStreamReader(pid.getErrorStream()), 1024);
                pid.waitFor();
                success = pid.exitValue();
                if(0==success){
                    System.out.println("sqlldr 执行成功!");
                }
                else  {
                    String line = null;
                    String errorMsg = "";
                    while (bufferedReader != null && (line = bufferedReader.readLine()) != null) {
                        errorMsg += line;
                    }
                    throw new Exception("执行" + shellCommand + "命令异常,异常信息" + errorMsg);
                }
                
    
            } catch (Exception ioe) {
                ioe.printStackTrace();
                System.out.println("Exception");
            } finally {
                if (bufferedReader != null) {
                    try {
                        bufferedReader.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
    
                }
                
            }
            return success;
        }

    2.剩下的就是权限相关的问题

    $ORACLE_HOME/rdbms/mesg/oraus.msg and oraus.msb 的权限  (也有说只需要更改oraus.msb 一个的权限即可 具体需自测)

    还有可能就是将这两个文件 放到上一层目录,也就是$ORACLE_HOME/rdbms/ 这个下面,并给够权限

    如果有写错的地方,请帮忙指正,有问题的一起讨论。

  • 相关阅读:
    CF1051F The Shortest Statement 题解
    CF819B Mister B and PR Shifts 题解
    HDU3686 Traffic Real Time Query System 题解
    HDU 5969 最大的位或 题解
    P3295 萌萌哒 题解
    BZOJ1854 连续攻击游戏 题解
    使用Python编写的对拍程序
    CF796C Bank Hacking 题解
    BZOJ2200 道路与航线 题解
    USACO07NOV Cow Relays G 题解
  • 原文地址:https://www.cnblogs.com/itlixian/p/11419742.html
Copyright © 2011-2022 走看看