2014-03-27 37 views
1

需求是从plsql调用java方法,我可以通过loadjava命令实现它。这我下面的步骤是:如何从PLSQL中调用java方法(这是在java包内)

第1步:创建Java类/ jar文件,并将其放置在UNIX盒

第2步:加载Java类/罐到数据库中,我可以看到一个新的对象在ALL_OBJCETS表与对象类型作为JAVA CLASS

步骤3:发布功能:使用Java静态方法创建的功能/ PROC

步骤4:执行该功能的/ proc。

它对我来说工作正常,但是当java类定义在java包中时,我面临的挑战是这样的。例如: 类文件是:

==========================

package emrsn.com; 
public class DBTEST { 

    public static String callMe(String input){ 
     return input; 
    } 
} 

==== ====================

现在,当我上传数据库中的上述java代码(类文件)时,我可以看到对象名称是“emrsn \ com \ DBTEST“,而不是ALL_OBJECTS表中的”DBTEST“,状态为INVALID。 当对象名称类似emrsn \ DBTEST时,我甚至无法重新编译数据库中的类文件(使用ALTER JAVA CLASS obj_name RESOLVE)。

请让他们知道是否有任何其他具体的方式来引用这种类型的Java类文件在数据库中,当它打包成Java。 您可以让我知道如何在创建函数或重新编译此对象时使用这些JAVA类对象(当它是emrsn/com/DBTEST时)。如前所述,我无法重新编译它们以查看确切的错误。

ALTER JAVA CLASS COM/emrsn/DBTEST RESOLVE

获得以下错误

Error report: 
SQL Error: ORA-00922: missing or invalid option 
00922. 00000 - "missing or invalid option" 
*Cause: 

如果我使用ALTER JAVA CLASS DBTEST解决的,它说没有找到对象。让我知道我可以如何引用这些对象。

回答

2

您需要用双引号(和正斜杠),并根据无论您使用的类或源文件正确的关键字:

alter java source "emrsn/com/DBTEST" compile; 
-- or 
alter java class "emrsn/com/DBTEST" compile; 
-- alternatively use resolve clause 

要获得全名的所有无效的对象使用

SELECT dbms_java.longname (object_name) FROM user_objects 
WHERE object_type = 'JAVA CLASS' AND status = 'INVALID'; 

http://docs.oracle.com/cd/B19306_01/java.102/b14187/appendixa.htm

要使用 “呼我”

CREATE OR REPLACE FUNCTION f_call_me(p_input VARCHAR2) RETURN VARCHAR IS LANGUAGE JAVA name 'emrsn.com.DBTEST.callMe(java.lang.String) return java.lang.String'; 
/
sho err 
select f_call_me('blah') from dual; 
+0

谢谢!它的工作.. – Anonymous

+0

不客气! –

+0

在创建功能时,是否需要使用如下代码: ============================ CREATE OR REPLACE FUNCTION DBTEST_FUNC (P_IN VARCHAR2)RETURN VARCHAR2 AS LANGUAGE JAVA NAME'emrsn/com/DBTEST.callMe(java.lang.String)return java.lang。串'; 如果我这样做,它的运行时错误: ============================== *原因:An尝试在Java类中执行不存在的方法。 或者在这里我也需要使用双引号。 感谢您的及时回应。 – Anonymous