概念:构建Java程序并将其加载到Oracle DB中 - Wrapper函数使用return调用java函数

时间:2018-05-24 08:28:08

标签: java oracle plsql

让我说我有以下java函数:

public class Example {

public String getHelloWorld(String hello) {
    return hello + "world"
 }

}

我通过getHelloWorld调用方法(" hello")并且函数让我"你好世界"作为回报。通过一个入门类(仅主要方法),我实例化一个新的"示例",并调用非静态函数getHelloWorld。这里很好。

现在我想把这个类放在Oracle数据库中:使用以下命令,它按预期工作; PLSQL:

create or replace java source named "com.test.Example" as
public class Example { [...]

现在我从数据库得到了成功创建java源代码的响应。

现在我尝试使用包装函数来稍后从pl / sql调用我的函数: function get_hello_world(i_string VARCHAR2) RETURN VARCHAR2 AS LANGUAGE java name 'com.test.Example.getHelloWorld( java.lang.String ) return java.lang.String';

现在我有了一些问题:这一切是否合作?我可以调用非静态方法,例如" getHelloWorld"就像我在这个例子中所做的那样?

如果只能使用静态方法,我是否需要编写main方法?如果是,我如何访问PL / SQL中的返回?从我的角度来看,主方法没有回报..

有人能给我任何线索来获得解决方案吗?

2 个答案:

答案 0 :(得分:2)

是的,您需要调用静态方法,但在静态方法中,您可以创建类的实例并调用非静态方法:

create or replace java source named "com.test.Example" AS
public class Example {
  public String getHelloWorld(
    final String hello
  ) {
    return hello + "world"
  }

  public static String getStaticHelloWorld(
    final String hello;
  ){
    final Example e = new Example();
    return e.getHelloWorld( hello );
  }
}
/

CREATE FUNCTION get_hello_world(i_string VARCHAR2) RETURN VARCHAR2 AS
  LANGUAGE java name 'com.test.Example.getStaticHelloWorld(
      java.lang.String
    ) return java.lang.String';

答案 1 :(得分:1)

我在大家的帮助下工作了!在更具体的票证ORA-29531: no method in class error的帮助下,我能够解决我的问题。你@MTO提出了权利的想法。如果有人对我的解决方案感兴趣,请查看链接票证的答案。

关键部件:

  1. 确保java库已成功加载到数据库中。可以通过我在问题中描述的pl / sql命令。但是,您所需的库总是有可能已加载到您的数据库中,但您并不知道。要验证此事实,请使用SELECT * FROM ALL_OBJECTS WHERE OBJECT_TYPE LIKE '%JAVA%' AND OBJECT_NAME LIKE '%ColognePhonetic%'

  2. 您无法直接运行非静态功能!一定要编写一个静态函数,只需实例化非satic函数的对象并调用所需的函数即可。示例:

    create or replace java source named "com.test.Example" AS public class Example { public String getHelloWorld ( final String hello ) { return hello + "world" } public static String getStaticHelloWorld(final String hello){ final Example e = new Example(); return e.getHelloWorld( hello ); } }

  3. 编写Wrapper函数,启动新创建的静态函数。

    CREATE FUNCTION get_hello_world(i_string VARCHAR2) RETURN VARCHAR2 AS LANGUAGE java name 'com.test.Example.getStaticHelloWorld( java.lang.String ) return java.lang.String';

  4. 请务必以正确的方式调用PL / SQL函数! declare result varchar2(20); begin -- Call the function result := get_hello_world('hello'); end;或SQL:

  5. select get_hello_world('hello') from dual;