我的软件要提供备份/恢复的功能,如何在存储过程中执行 imp/exp等命令?

解决方案 »

  1.   

    在存储过程里,不能调用imp/exp命令。
    想其他办法吧。
      

  2.   

    有两种方法可以做到:
    A。使用java
    B。使用pro*c
    先介绍使用Java的方法:
    a.首先建立java类
    import java.io.*;public class Cmd {
    public static boolean cmdExecute(String cmd) {
    Process proc=null;
    int exitValue;
    try {
    System.out.println(cmd);
    proc=Runtime.getRuntime().exec(cmd);
    exitValue=proc.waitFor();
    return (exitValue==0);
    } catch(Exception e){
    System.out.println("Failure:"+e.getMessage());
    return false;

    }
    }
    public static boolean cmdExecute(String cmd,int interCmd) {
    if (interCmd==1)
    {
    return cmdExecute("C:\\Windows\\System32\\cmd.exe /c /y "+cmd);
    }
    else
    {
    return cmdExecute(cmd);
    }
    }
    public static void main(String args[]) {
    String cmd="";
    for(int i=0;i<args.length;i++)
    cmd+=" "+args[i]; cmdExecute(cmd,1);
    }
    }
    b.使用oracle提供的loadjava工具load到系统中
    c.付权限
    exec dbms_java.grant_permission( 'SYSTEM', 'SYS:java.io.FilePermission','G:\waitfor.exe', 'execute')
    EXEC Dbms_Java.Grant_Permission('SYSTEM', 'java.io.FilePermission', '<>', 'read ,write, execute, delete');
    EXEC Dbms_Java.Grant_Permission('SYSTEM', 'SYS:java.lang.RuntimePermission', 'writeFileDescriptor', '');
    EXEC Dbms_Java.Grant_Permission('SYSTEM', 'java.io.FilePermission', 'G:\*', 'read,write,delete');
    exec dbms_java.grant_permission( 'SYSTEM', 'SYS:java.io.FilePermission','C:\Windows\system32\cmd.exe', 'execute')
    exec dbms_java.grant_permission( 'SYSTEM', 'SYS:java.io.FilePermission','G:\bb.bat', 'execute')4.建立存储过程。
     create or replace procedure cmdExecute(cmd varchar2) as language java name 'DiffCmd.cmdExecute(java.lang.String)';5。完成,直接执行即可。
    SQL>cmdExecute("exp...");
      

  3.   

    非常感谢jack_i(bing)的解答,请问“使用pro*c”该如何做呢。。我不懂JAVA..
      

  4.   

    VC直接就可以。
    你先VC程序来接受你的各种需要信息,比如fromuser?,touser=?等等,然后你把原来需要在DOS窗口下的语句用写成一个批处理文件,然后你用VC的WINEXEC命令执行你的批处理文件就行了,
    类似如下:
    WinExec("CMD /C \\test_b.bat",SW_SHOWNORMAL);
    我刚作过这样的程序,希望有帮助