public class HelloWorld{
public static void add(int a, int b){
System.out.println(a+b);
}
}
然后我将它加载到oracle中
loadjava -user system/admin Helloworld.class
这句话很好。
之后我写了这个程序:
create or replace
PROCEDURE start_helloworld(a in number, b in number)
AS language java
name 'HelloWorld.add(int,int)';
我希望能够在PL / SQL中调用该过程:
exec start_helloworld(1,1);
但它给出了我提到的错误。
我无论如何都不是Oracle专家,但我最近遇到过这个问题所以我只是想发表评论。出于某种原因,我不能只发表评论,所以这是我的回答。
评论:当我收到Ora-29516错误时,它会附带一个理由描述。当你得到错误时,还有更多错误吗?
答案:如果您的Aurora Assertion错误附带“Uncaught exception System error:java / lang / UnsupportedClassVersionError”=>
当我用于编译类文件的Java版本与Oracle中的Java版本(11.0中的1.5.0)不同时,我收到此错误。为了确保您完美匹配,让Oracle为您编译课程。您将获得两个好处:1)您将确保Java版本完全匹配。 2)您将源代码作为数据库“JAVA SOURCE”对象加载以供将来参考。出于安全考虑,您可能希望将其锁定。
loadjava -user scott / tiger -resolve HelloWorld.java
通过使用带有resolve选项的源文件,Oracle将创建源对象并编译类对象的代码。如果省略-resolve选项,Oracle将创建源对象并仅在调用它时对其进行编译。我认为这可能具有良好的灵活性选择但性能缺陷。
您无法从Oracle Java代码执行控制台输出,因为它在数据库中运行。也许如果您传入和传入/传出变量,则将算术赋值的输出分配给变量并输出在调用PL / SQL块中:
var mynum NUMBER
exec start_helloworld(1,1,:mynum);
print mynum;
您当然需要修改java和PL / SQL包装器以添加新参数:
public static void add(int a, int b, int c){
c = a+b;
}
和
create or replace
PROCEDURE start_helloworld(a in number, b in number, c in out number)
AS language java
name 'HelloWorld.add(int,int,int)';
发生此错误的原因是oracle和java编译器中不同java版本的不兼容性。 - > oracle版本: - TO在ORACLE中检查JAVA版本
SELECT dbms_java.get_ojvm_property(PROPSTRING=>'java.version') FROM dual;
遵循这一步骤:
// java的
class simple{
public static String world(){
return("Hello Java");
}
}
而不是加载类Simple直接加载你的java,第1步:
loadjava -user system/admin simple.java
第2步:
然后>创建一个过程
CREATE OR REPLACE PROCEDURE PROC_DEMO as
language java
name 'simple.world()';
/
STEP3:
declare -- Parameter declaration
RESULT VARCHAR2(2000);
begin
-- Please customize initialization
-- Call the procedure/function
RESULT := FUNC_DEMO;
-- Print out the results
dbms_output.put_line( 'RESULT = ' || SUBSTR( RESULT, 1, 255));
end;