概念:构建Java程序并将其加载到Oracle DB中-包装器函数调用Java函数并返回

概念:构建Java程序并将其加载到Oracle DB中-包装器函数调用Java函数并返回,java,oracle,plsql,Java,Oracle,Plsql,假设我得到了以下java函数: public class Example { public String getHelloWorld(String hello) { return hello + "world" } } 我通过getHelloWorldhello调用该方法,函数返回helloworld。通过一个starter类main方法,我只实例化了一个新的示例,并调用非静态函数getHelloWorld。这里一切都很好 现在我想把这个类放在Oracle数据库中:使用下面的命令

假设我得到了以下java函数:

public class Example {

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

}
我通过getHelloWorldhello调用该方法,函数返回helloworld。通过一个starter类main方法,我只实例化了一个新的示例,并调用非静态函数getHelloWorld。这里一切都很好

现在我想把这个类放在Oracle数据库中:使用下面的命令,它可以正常工作;PLSQL:

create or replace java source named "com.test.Example" as
public class Example { [...]
现在,我从数据库得到的响应是,java源代码已成功创建

现在,我尝试更正包装器函数,以便稍后从pl/sql调用我的函数: 函数get\u hello\u worldi\u string VARCHAR2 返回VARCHAR2作为 语言java名称'com.test.Example.getHelloWorld java.lang.String 返回java.lang.String'

现在我有了一些问题:所有这些一起工作吗?我可以像在本例中那样调用非静态方法如getHelloWorld吗

如果只有静态方法是可能的,我需要写一个主方法吗?如果是,如何访问PL/SQL中的返回?在我看来,main方法没有返回


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

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

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';

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

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';

我在你们的帮助下成功了!在一张更具体的罚单的帮助下,我解决了我的问题。你提出了权利思想。如果有人对我的解决方案感兴趣,请看下面链接的问题的答案

关键部分:

确保java库已成功加载到数据库中。如我在问题中所述,通过pl/sql命令。但总有可能您想要的库已经加载到数据库中,但您不知道。若要验证这一事实,请从所有对象中使用SELECT*,其中对象类型为“%JAVA%”,对象名称为“%colognephonical%”

您不能直接运行非静态函数!一定要编写一个静态函数,其中只需实例化none-satic函数的对象并调用所需的函数。例如:

创建或替换名为com.test.Example的java源代码 公共类示例{ 公共字符串getHelloWorld最终字符串hello{ 返回hello+world} 公共静态字符串getStaticHelloWorldfinal字符串hello{ 最终示例e=新示例; 返回e.getHelloWorld hello; } }

编写一个包装函数,启动新创建的静态函数

创建函数get\u hello\u worldi\u string VARCHAR2返回VARCHAR2 AS 语言java名称'com.test.Example.getStaticHelloWorld java.lang.String 返回java.lang.String'

请确保以正确的方式调用PL/SQL函数!声明 结果varchar220; 开始 -调用函数 结果:=获取“你好”世界“你好”; 终止或SQL:


从dual中选择get_hello_world'hello'

我在你们的帮助下成功了!在一张更具体的罚单的帮助下,我解决了我的问题。你提出了权利思想。如果有人对我的解决方案感兴趣,请看下面链接的问题的答案

关键部分:

确保java库已成功加载到数据库中。如我在问题中所述,通过pl/sql命令。但总有可能您想要的库已经加载到数据库中,但您不知道。若要验证这一事实,请从所有对象中使用SELECT*,其中对象类型为“%JAVA%”,对象名称为“%colognephonical%”

您不能直接运行非静态函数!一定要编写一个静态函数,其中只需实例化none-satic函数的对象并调用所需的函数。例如:

创建或替换名为com.test.Example的java源代码 公共类示例{ 公共字符串getHelloWorld最终字符串hello{ 返回hello+world} 公共静态字符串getStaticHelloWorldfinal字符串hello{ 最终示例e=新示例; 返回e.getHelloWorld hello; } }

编写一个包装函数,启动新创建的静态函数

创建函数get\u hello\u worldi\u string VARCHAR2返回VARCHAR2 AS 语言java名称'com.test.Example.getStaticHelloWorld java.lang.String 返回java.lang.String'

请确保以正确的方式调用PL/SQL函数!声明 结果varchar220; 开始 -调用函数 结果:=获取“你好”世界“你好”; 终止或SQL:


从dual中选择get_hello_world'hello'

执行时会发生什么?ORA-29531:没有方法getHelloWorldin类[…]错误,包装函数已编译且有效,以及java sou
编译的源代码是最新的吗?是的,为了验证源代码的状态,我注销了数据库并重新连接到它。另外,顺便提一下,我没有忘记在每个步骤后提交。执行它时会发生什么?ORA-29531:没有方法getHelloWorldin类[…]错误,包装函数已编译且有效,以及java source编译的源是否最新?是的,验证源的状态,我注销了数据库并重新连接到它。此外,顺便说一句,我没有忘记在每一步之后都要承诺。