我想在java执行linux上的导入oracle数据的sqlload指令,但首先必须先执行su - oracle,然后执行sqllldr usering=?  control=?执行,这个同时执行多条指令如果完成呢。
Runtime r = Runtime.getRuntime();
Process process = r.exec("su - oracle && sqlldr userid=? control=..ctl"); //这个不行啊
请坛子里大神帮帮忙

解决方案 »

  1.   

    把命令写好,直接执行一个批处理吧,这样最简单当然也可以直接执行 bash,然后用 getOutputStream() 往里面一行一行写命令。
      

  2.   

    我每次执行的ctl文件都不一样(ctl文件是我从过去的一个参数),执行批处理恐怕行不通,可否告知直接执行bash咋执行,谢了
      

  3.   

    即便是批处理也可以传递参数啊,而且可以传递多个参数
    甚至你可以动态生成一个批处理文件,再执行它。
    直接执行bash,就跟你Windows下直接执行cmd是类似的,但是你看不到操作界面。所以要用 getOutputStream() 然后当作键盘输入来写命令行;
    同时还要用 getInputStream() 当作显示器来读取响应内容;
    此外还要用 getErrorStream() 来读取可能的出错信息。所以总体复杂度高很多,不到万不得已,建议用批处理。
      

  4.   

    我现在只需要执行两条命令 1:su - oracle 2:sqlldr userid=user/pwd@orc control=aa.ctl
    批处理不太会啊,而且是linux系统下的批处理,麻烦指点
      

  5.   

    linux的批处理跟Windows的差别并不大啊,就是个文本文件。自己先Google下,然后试试看嘛比如先创建个文本文件(不需要扩展名),比如:“aaa”,随便输入几行命令:
    cd \
    ls然后:
    chmod -777 aaa然后执行:
    .\aaa
      

  6.   

    脚本写好了,执行成功了,可是这是一个写死的脚本,比如我需要执行sqlldr的ctl的名称是从前台传过去的,如果传参数到脚本里?这个郁闷了
      

  7.   

    你的脚本带参数,传入一个ctl文件就可以了
    脚本里通过$1获取ctl,java调用的时候传入ctl 如 runtime.exec("xxx脚本 clt文件");
      

  8.   

    su - oracle -c 'sqlldr emenu/emenu control=@filename@ log=loadlog.log bad=badlog.log'
      

  9.   

    su - oracle -c 'sqlldr语句'