2013-03-06 128 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類不存在