myorama
4/22/2015 - 10:48 AM

OS Command through PLSQL and Java Class

OS Command through PLSQL and Java Class

DECLARE
  schema_name VARCHAR(30) := '&user';
BEGIN
  dbms_java.grant_permission(schema_name, 'SYS:java.lang.RuntimePermission', 'writeFileDescriptor', '');
  dbms_java.grant_permission(schema_name, 'SYS:java.lang.RuntimePermission', 'readFileDescriptor', '');
  dbms_java.grant_permission(schema_name, 'SYS:java.io.FilePermission', '/bin/sh', 'execute');
  dbms_java.grant_permission(schema_name, 'SYS:java.io.FilePermission', 'C:\\Windows\\System32\\cmd.exe', 'execute');
END;
/
CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED &user.."OSCommand" AS
  import java.io.*;

  public class OSCommand {

    public static String executeCommand(String command) {
      StringBuffer sb = new StringBuffer();
      try {
        String[] finalCommand;
        if (System.getProperty("os.name").toLowerCase().indexOf("windows") > -1) {
          finalCommand = new String[4];
          finalCommand[0] = "C:\\winnt\\system32\\cmd.exe";
          finalCommand[1] = "/y";
          finalCommand[2] = "/c";
          finalCommand[3] = command;
        } else { // Linux or Unix System
          finalCommand = new String[3];
          finalCommand[0] = "/bin/sh";
          finalCommand[1] = "-c";
          finalCommand[2] = command;
        }
        // Execute the command...
        final Process pr = Runtime.getRuntime().exec(finalCommand);
        // Capture output from STDOUT
        BufferedReader br_in = null;
        try {
          br_in = new BufferedReader(new InputStreamReader(pr.getInputStream()));
          String buff = null;
          while ((buff = br_in.readLine()) != null) {
            sb.append(buff);
            sb.append("\n");
            try {Thread.sleep(100); } catch(Exception e) {}
          }
          br_in.close();
        } catch (IOException ioe) {
          System.out.println("Errorting process output.");
          ioe.printStackTrace();
        } finally {
          try {
            br_in.close();
          } catch (Exception ex) {}
        }
        // Capture output from STDERR
        BufferedReader br_err = null;
        try {
          br_err = new BufferedReader(new InputStreamReader(pr.getErrorStream()));
          String buff = null;
          while ((buff = br_err.readLine()) != null) {
            sb.append("stderr:");
            sb.append(buff);
            sb.append("\n");
            try {Thread.sleep(100); } catch(Exception e) {}
          }
          br_err.close();
        } catch (IOException ioe) {
          System.out.println("Errorting execution errors.");
          ioe.printStackTrace();
        } finally {
          try {
            br_err.close();
          } catch (Exception ex) {}
        }
      }
      catch (Exception ex) {
        System.out.println(ex.getLocalizedMessage());
      }
      return sb.toString();
    }
  };
/
CREATE OR REPLACE FUNCTION &user..oscomm (p_command IN VARCHAR2) RETURN VARCHAR2
  AS LANGUAGE JAVA NAME
    'OSCommand.executeCommand (java.lang.String) return java.lang.String';
/