2013-03-06 133 views
4

Oracle环境。创建或替换并解析Java源代码,我无法使用Java源代码创建一个函数

下面的Java源已被正确编译:

CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED hr.roman 
    AS package Package.NumeriRomani; 

class Numero{ 
    String r=""; 
    int a=0; 

    Numero(int n){ 
     a=n; 
      if(n==0){ 
       r="NULL"; 
       return;} 
      while(n>=1000){ 
        r+="M"; 
        n-=1000;} 
      if(n>=900){ 
        r+="CM"; 
        n-=900;} 
      while(n>=500){ 
        r+="D"; 
        n-=500;} 
      if(n>=400){ 
        r+="CD"; 
        n-=400;} 
      while(n>=100){ 
        r+="C"; 
        n-=100;} 
      if(n>=90){ 
        r+="XC"; 
        n-=90;} 
      while(n>=50){ 
        r+="L"; 
        n-=50;} 
      if(n>=40){ 
        r+="XL"; 
        n-=40;} 
      while(n>=10){ 
        r+="X"; 
        n-=10;} 
      if(n>=9){ 
        r+="IX"; 
        n-=9;} 
      if(n>=5){ 
        r+="V"; 
        n-=5;} 
      if(n==4){ 
        r+="IV"; 
        n-=4;} 
      while(n>=1){ 
        r+="I"; 
        n--;} 
    }//Numero(int) 
    Numero(String k){ 
     int vCor,vNext; 
     r=k; 
     for(int i=0;;i++){ 
      vCor=valore(k.charAt(i)); 
      if(i==k.length()-1){ 
       a+=vCor; 
       break;} 
      vNext=valore(k.charAt(i+1)); 
      if(vCor>=vNext) 
       a+=vCor; 
      else 
       a-=vCor; 
     } 
    } 

    static public int valore(char c){ 
     switch(c){ 
      case 'I': return 1; 
      case 'V': return 5; 
      case 'X': return 10; 
      case 'L': return 50; 
      case 'C': return 100; 
      case 'D': return 500; 
      case 'M': return 1000; 
      default: return 0; 
     } 
    } 

    public int getArabo(){ 
     return a; 
    } 
    public String getRomano(){ 
     return r; 
    } 
    } 
/

我想创造一个getArabo功能和getRoman功能,但我总是收到错误。

我曾尝试用:

CREATE OR REPLACE FUNCTION hr.converti (alfa IN varchar2) 
    RETURN VARCHAR2 
AS 
    LANGUAGE JAVA 
    NAME 'ROMAN.getArabo(java.lang.String) return java.lang.String'; 
/

,但我收到的错误:

select hr.converti('XII') from dual; 

ORA-29540:ROMAN类不存在

我怎么能解决这个问题?

回答

5

这里有您需要更正,以便能够使用这个java类的东西:

  1. 使用静态方法,使他们能够从Oracle调用,而不对象实例化
  2. 你的源被命名为ROMAN,但是你的班级被命名为Numero。从Oracle调用它时,您将引用该类。 给同一个名字的类和源都会避免混淆。
  3. Java是强类型的,你不能转换的方法int getArabo()到:

    getArabo(java.lang.String) return java.lang.String 
    

这里有一个工作示例:

SQL> CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED "Roman" AS 
    2 class Roman { 
    3  public static int getArabo(java.lang.String x){ 
    4   return 0; 
    5  } 
    6 } 
    7/

Java created 

SQL> CREATE OR REPLACE FUNCTION converti (alfa IN varchar2) 
    2  RETURN NUMBER 
    3 AS LANGUAGE JAVA NAME 'Roman.getArabo(java.lang.String) return int'; 
    4/

Function created 

SQL> select converti ('aaa') from dual; 

CONVERTI('AAA') 
--------------- 
       0 

此外,还可以使用Oracle函数将数字转换为罗马字符值TO_CHAR(但是TO_NUMBER功能不能用于反向操作):

SQL> SELECT to_char(2013, 'RN') FROM dual; 

TO_CHAR(2013,'RN') 
------------------ 
     MMXIII 
+0

什么是TO_CHAR(2013年, 'RN')的反命令?如何从MMXIII开始回到阿拉伯数字?来自DUAL的SELECT TO_NUMBER('MMXIII','NR')不起作用。 – UltraCommit 2013-03-06 14:51:46

+1

@UltraCommit你说得对,它似乎只能单向工作! – 2013-03-06 15:01:28

+0

我遇到纠正我的来源的问题,请问您能帮我些忙吗? – UltraCommit 2013-03-06 15:03:32

2

尝试使用相同的类名和Java源名称

Java源的名字:“hr.roman” 类的名字:“ NÚMERO”

,所以你只能得到这个错误ORA-29540:ROMAN类不存在