如题,Oracle中关于Java过程出错了,具体代码如下:Java存储过程
=================
CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED "SRCEXECUTE" AS
import java.lang.*;
import java.io.*;public class ExecuteOS
{
  public static void printFile (String fileName) throws IOException
  {
    File fileOut;
    FileReader fileReaderOut;
    BufferedReader buffReader;
    String strRead;    fileOut = new File (fileName);
    fileReaderOut = new FileReader (fileOut);
    buffReader = new BufferedReader(fileReaderOut);
    while ((strRead = buffReader.readLine()) != null)
      System.out.println(strRead);
  }  public static void execOSCmd (String cmd) throws IOException, java.lang.InterruptedException
  {
    String[] strCmd = {"cmd.exe", "/c", "1>c:\\stdout.txt", "2>c:\\stderr.txt", cmd};    System.out.println("==========\r\nExecuting OS command...");
    Process p = Runtime.getRuntime().exec(strCmd);
    p.waitFor();
    System.out.println("\r\n==========\r\nThis was the STANDARD OUTPUT for the command:");
    printFile ("c:\\stdout.txt");
    System.out.println("\r\n==========\r\nThis was the ERROR OUTPUT for the command:");
    printFile ("c:\\stderr.txt");
  }
};
以上代码执行后提示“Java已创建”,也就是说上面代码正确;
接着创建一个进程,代码如下:进程代码:
==============================
create or replace procedure "PROCEXECUTE" (p_command varchar2)
as language java
name 'ExecuteOS.execOSCmd (java.lang.String)';
EXEC PROCEXECUTE ('dir c:');可是在执行完代码的这段程序则提示“创建的过程带有编译错误”,这里请教大N错误的地方在哪儿,小弟感激不尽!

解决方案 »

  1.   

    --在Oracle中如下执行存贮过程:exec SRCEXECUTE;
      

  2.   

    create or replace and compile java source named SRCEXECUTE as
    import java.io.*;
    public class ExecuteOS
    {
      public static void printFile (String fileName) throws Exception 
      { 
        File fileOut; 
        FileReader fileReaderOut; 
        BufferedReader buffReader; 
        String strRead;     fileOut = new File (fileName); 
        fileReaderOut = new FileReader (fileOut); 
        buffReader = new BufferedReader(fileReaderOut); 
        while ((strRead = buffReader.readLine()) != null) 
          System.out.println(strRead); 
      }   public static void execOSCmd (String cmd) throws Exception
      { 
        String[] strCmd = {"cmd.exe", "/c", "1>c:\\stdout.txt", "2>c:\\stderr.txt", cmd};     System.out.println("==========\r\nExecuting OS command..."); 
        Process p = Runtime.getRuntime().exec(strCmd); 
        p.waitFor(); 
        System.out.println("\r\n==========\r\nThis was the STANDARD OUTPUT for the command:"); 
        printFile ("c:\\stdout.txt"); 
        System.out.println("\r\n==========\r\nThis was the ERROR OUTPUT for the command:"); 
        printFile ("c:\\stderr.txt"); 
      }   public static void entry()
      {
      }
    }
      

  3.   

    用try catch处理异常把,你把JAVA异常给oracle过程处理?
      

  4.   

    java已创建并不代表你procedure能被正确编译.检查一下你的语法再试.
      

  5.   

    SQL> alter java source "SRCEXECUTE" compile;
      

  6.   


    public class AccessControlExceptionextends SecurityException
    此异常由 AccessController 抛出,提示请求的访问(对关键系统资源(如文件系统或网络)的访问)被拒绝。 拒绝访问的原因各不相同。例如,请求的权限可能类型不正确、包含无效值,或者根据安全策略不允许请求访问。在抛出异常时,只要可能,就应给出此类信息。 
      

  7.   

    权限问题的话,参考以下:exec dbms_java.grant_permission( 'apps',   
                                     'SYS:java.net.SocketPermission',   
                                     '127.0.0.1:7777',   
                                     'connect,resolve') ;  exec dbms_java.grant_permission('apps','java.util.PropertyPermission','*','*');   
    exec dbms_java.grant_permission('apps','java.io.SerializablePermission','*','*');   
    exec dbms_java.grant_permission('apps','java.io.FilePermission','*','*');   
    exec dbms_java.grant_permission('apps','java.net.NetPermission','*','*');   
    exec dbms_java.grant_permission('apps','java.net.SocketPermission','*','*');   
    exec dbms_java.grant_permission('apps','java.lang.RuntimePermission','*','*');   
    exec dbms_java.grant_permission('apps','java.lang.reflect.ReflectPermission','*','*');   
    exec dbms_java.grant_permission('apps','java.security.SecurityPermission','*','*');   
    exec dbms_java.grant_permission('apps','oracle.aurora.rdbms.security.PolicyTablePermission','*','*');   
    exec dbms_java.grant_permission('apps','oracle.aurora.security.JServerPermission','*','*'); 
      

  8.   

    java的lang包是默认引入的,不用importexecOSCmd调用printFile 方法,printFile 可以throws Exception
    让execOSCmd处理异常建议这样public static String execOSCmd (String cmd)返回的String为错误信息!这样好收集你的JAVA异常信息!否则错在哪里不知道
      

  9.   

    #4
    BlueskyWide ,你的意思是在SQL×Plus中先执行Java存储过程语句,创建一个Java过程,然后再执行进程代码,最后set serveroutput on;然后执行exec SRCEXECUTE;语句是吗?我这样做过,可是由于进程代码在编译时有错误,所以不能执行!
    #5
    还没有试,不过十分感谢您抽出时间看代码,作为菜鸟的我十分感激!;)#6
    java异常不知道,我没有学过java,我只是在Oracle中调用Java存储过程。即以上代码全部在SQL*Plus中执行的!#7
    Java存储过程执行show error,提示无错误#8
    alter java source "SRCEXECUTE" compile;执行该句提示Java已改变!具体说明意思不是很明白!望告知!#9
    整个java存储过程+进程主要用来在SQL*Plus下执行后能得到一个类似cmd的shell#10
    好的,我试试,看是不是权限问题#11
    十分感谢,呵呵!!!#12
    好的,十分感谢!我会试试去总而言之,ellle十分感谢大家!:)
    等下结贴,人人有分!!