让我说我有以下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中的返回?从我的角度来看,主方法没有回报..
有人能给我任何线索来获得解决方案吗?
答案 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提出了权利的想法。如果有人对我的解决方案感兴趣,请查看链接票证的答案。
关键部件:
确保java库已成功加载到数据库中。可以通过我在问题中描述的pl / sql命令。但是,您所需的库总是有可能已加载到您的数据库中,但您并不知道。要验证此事实,请使用SELECT * FROM ALL_OBJECTS WHERE OBJECT_TYPE LIKE '%JAVA%' AND OBJECT_NAME LIKE '%ColognePhonetic%'
您无法直接运行非静态功能!一定要编写一个静态函数,只需实例化非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 );
}
}
编写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';
请务必以正确的方式调用PL / SQL函数! declare
result varchar2(20);
begin
-- Call the function
result := get_hello_world('hello');
end;
或SQL:
select get_hello_world('hello') from dual;