创建或替换并解析Java源代码,我无法使用java源创建函数

Ult*_*mit 6 java oracle

Oracle环境.

以下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;
    }
    }
/
Run Code Online (Sandbox Code Playgroud)

我想为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';
/
Run Code Online (Sandbox Code Playgroud)

但我收到错误:

select hr.converti('XII') from dual;
Run Code Online (Sandbox Code Playgroud)

ORA-29540:ROMAN类不存在

我怎么能解决这个问题?

Vin*_*rat 5

以下是您需要更正才能使用此java类的内容:

  1. 使用静态方法,以便可以在没有对象实例化的情况下从Oracle调用它们
  2. 您的源名称已命名ROMAN,但您的类已命名Numero.从Oracle调用它时,您将引用该类.赋予类和源相同的名称可以防止混淆.
  3. java是强类型的,你不能将方法转换int getArabo()为:

    getArabo(java.lang.String) return java.lang.String
    
    Run Code Online (Sandbox Code Playgroud)

这是一个有效的例子:

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
Run Code Online (Sandbox Code Playgroud)

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

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

TO_CHAR(2013,'RN')
------------------
         MMXIII
Run Code Online (Sandbox Code Playgroud)