oracle调用java方法错误: ORA-29541: 无法解析类.过程如下: 
 1.首先我做了新建了一个测试的项目,里面就只有一个单独的Main测试类. 里面有一个方法:
public static String sayHello(String name){
    return " hello " + name;
}
 2.然后把项目打包成prj.jar.
   我用loadjava -user sys/sys@databaseName prj.jar 
select DBMS_JAVA.LONGNAME(OBJECT_NAME) as OBJECT_NAME
  from USER_OBJECTS
 where OBJECT_TYPE like 'JAVA%'
 and object_name like '%Main'
已经查询到这个类.
 3.然后在oracle中发布java程序:
create or replace function hello (name VARCHAR2) return VARCHAR2 
      as language java name
  'Main.sayHello (java.lang.String) return java.lang.String ';
执行:
  select hello(' world! ') from dual;
提示:ORA-29541: 无法解析类 SYS.Main.
请指教.

解决方案 »

  1.   

    问题是我导入了jar包.然后怎么"设置"才能让我来引用这个包呢? 
      

  2.   

    给你个例子:
    现在,10G及其以后版本的Oracle数据库提供了对Java程序的更多的支持,很好的解决了这方面的问题. 解决方法如下,
    1. 首先我们创建调用操作系统命令的Java方法
    create or replace and compile java source named oscmd as
    import java.io.*;
    import java.lang.*;
    public class OSCmd extends Object {
        public static int OSCmd(String args) {
            Runtime rt = Runtime.getRuntime();
            int rc = -1;
            try {
                Process p = rt.exec(args);
                int bufSize = 4096;
                BufferedInputStream bis = new BufferedInputStream(p.getInputStream(), bufSize);
            int len;
            byte buffer[] = new byte[bufSize];
            while ((len = bis.read(buffer, 0, bufSize)) != -1)
                    System.out.write(buffer, 0, len);
                rc = p.waitFor();
            } catch (Exception e) {
                e.printStackTrace();
                rc = -1;
            } finally {
                return rc;
            }
        }
    }
    2. 然后,再创建一个PL/SQL函数调用Java方法
    CREATE OR REPLACE FUNCTION Run_Cmd(p_Cmd IN VARCHAR2) RETURN NUMBER AS LANGUAGE JAVA NAME 'OSCmd.OSCmd(java.lang.String) return integer';
    3. 之后我们就可以轻松的在Oracle程序中调用操作系统命令了
    declare
        n number;
    begin
        n := Run_Cmd('Copy C:\temp.txt D:\temp.txt');
    end;
      

  3.   

     二楼的方式我知道.如果java类都是用oracle写的话 我测试过是可以的.关键是我直接调用外部jar包的中的静态方法,就有问题. 请指教.
      

  4.   

    给你一个例子:
    test/Main.javapackage test;public class Main{
       public static String sayHello(String name){
          return " hello " + name;
       }
    }
    编译
    javac test/Main.java
    打包
    jar cvf test.jar test/Main.class
    加载
    loadjava -r -user hr/oracle test.jar创建函数create or replace function hello (name VARCHAR2) return VARCHAR2  
      as language java name
      'test.Main.sayHello (java.lang.String) return java.lang.String ';
    测试语句select hello('Amy') from dual;
    结果
    HELLO('AMY')                                                                    
    -----------------
     hello Amy                                                                      
    1 row selected.
      

  5.   

    ORA-29541这个错误,是编译.class文件的jdk版本和执行该文件的jdk版本不同oracle 9的JDK应该是1.4
    oracle 10的JDK应该是1.5