从java app以管理员身份执行sql loader

时间:2013-12-08 08:10:39

标签: java sql windows cmd

我的要求是在我的java应用程序中使用sql loader加载脚本。为此,我一直在使用以下脚本

D:\oracle\product\10.2.0\db_1\BIN\SQLLDR.EXE userid=myDBUserID/myDBPswrd  data=C:\Users\myUserName\Desktop\sql_ldr_files\1\table_export_DATA.ldr control=C:\Users\myUserName\Desktop\sql_ldr_files\1\table_export_DATA.ctl log=C:\Users\myUserName\Desktop\sql_ldr_files\1\logitit.log discard=C:\Users\myUserName\Desktop\sql_ldr_files\1\discard.txt bad=C:\Users\myUserName\Desktop\sql_ldr_files\1\bad.txt

但是在尝试首先在cmd提示符下运行它时,我意识到如果我不运行该命令,则在“以管理员身份运行”启动的cmd提示符下将无法运行该命令。

通过“以管理员身份运行”启动cmd后,命令成功运行,脚本已执行,表格已正确填充。

现在我的任务是使用相同的代码,但是在java代码中运行它。为此,我使用了以下java代码,

  import java.io.FileWriter.*;
import java.io.BufferedWriter.*;
import java.io.BufferedReader.*;
import java.io.InputStreamReader.*;
import java.io.FileWriter;
import java.io.BufferedWriter;
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class RunSqlLrdFromJava
{   
    public static void main(String s[])
    {
    try{
        Runtime rt = Runtime.getRuntime();
        String sqlLoaderPath = "D:\\oracle\\product\\10.2.0\\db_1\\BIN\\";
        String runAsCmd="runas /user:myPCName\\administrator ";
    String cmd = runAsCmd + "\""+sqlLoaderPath + "SQLLDR.EXE userid=myDBUserID/myDBPswrd "
                            + " data=C:\\Users\\myUserName\\Desktop\\sql_ldr_files\\1\\table_export_DATA.ldr"
                            + " control=C:\\Users\\myUserName\\Desktop\\sql_ldr_files\\1\\table_export_DATA.ctl"
                            + " log=C:\\Users\\myUserName\\Desktop\\sql_ldr_files\\1\\logitit.log"
                            + " discard=C:\\Users\\myUserName\\Desktop\\sql_ldr_files\\1\\discard.txt"
                        + " bad=C:\\Users\\myUserName\\Desktop\\sql_ldr_files\\1\\bad.txt " + "\"";
        try{                    

        FileWriter file = new FileWriter("ExceptionInSqlldr.txt");
        BufferedWriter bf = new BufferedWriter(file);
        bf.write("SQLLDR COMMAND:\n" +cmd +"---------------------------------\n\n\n");
        Process proc = rt.exec(cmd);
        int exitVal = proc.waitFor();
        BufferedReader br = new BufferedReader(new
        InputStreamReader(proc.getErrorStream()));
        String line;
        System.out.println("\n------------------exitVal:"+exitVal+"------------------\n\n");
        bf.write("SQLLDR COMMAND:\n" +cmd +"---------------------------------\n\n\n");
        if(br!=null && exitVal!=0)
        {   while((line = br.readLine()) != null) 
            {
                bf.write("\n"+ line +"\n");
                System.out.println("Read from error stream: \"" + line + "\"");
            }
        }


        proc.destroy();

        bf.close();
        }
        catch(Exception e)
        {
            e.printStackTrace();
            //System.out.println(e.getMessage());
        }

        }
        catch(Exception e)
        {
            e.printStackTrace();
            //System.out.println(e.getMessage());
        }
        }       

    }

但这一次,它不会运行。

我的问题是,当我们使用“run as”在命令提示符下以管理员身份运行该进程时,它会提示输入密码。因此,当我在java代码中使用相同的“run as”命令时,我无法提供对该提示的响应[至少看起来如此]。

是否有一个出路,我可以通过在命令中传递管理员密码,从我的java代码中以管理员身份运行命令,以便我的java代码成功运行它?

请提出建议,因为我之前从未这样做过。

热烈的问候。

0 个答案:

没有答案