我似乎无法从PLSQL调用java

时间:2015-10-09 08:04:38

标签: java oracle plsql

我有以下代码(我想要做的是通过plsql调用java代码在google.com中打开一个新网页):

         CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED "Hello" AS   
            import java.awt.Desktop;
            import java.net.URI;
            class Hello
            {
             public static void main(String args[]) throws Exception
             {
             Desktop d=Desktop.getDesktop();
             d.browse(new URI("http://google.com"));
             }
            };
              /

        CREATE OR REPLACE PROCEDURE SAMP_JAVA_CALL AS 
        LANGUAGE JAVA NAME 'Hello.main(java.lang.String[])';
        /

并且编译时没有任何错误但是当我尝试执行SAMP_JAVA_CALL过程时,我收到此错误:

  Error report -
  ORA-29549: class JAYPV.Hello has changed, Java session state cleared
  ORA-06512: at "JAYPV.SAMP_JAVA_CALL", line 1
  ORA-06512: at line 1
  29549. 00000 -  "class %s.%s has changed, Java session state cleared"
  *Cause:    A class in use by the current session was redefined or dropped,
             invalidating the current Java session state and requiring that
             it be cleared.
  *Action:   No action required. 

你知道为什么这不起作用吗? 我使用的是sqldeveloper版本4.0.0.13,Oracle版本12c。

1 个答案:

答案 0 :(得分:1)

ORA-29549: class ... has changed, Java session state cleared
  

原因:重新定义或删除当前会话正在使用的类,使当前Java会话状态无效并要求将其清除。

"正常"这种错误的方法是编译数据库中的java对象并在同一个会话中执行。基本上当你改变java对象时会发生这种情况。 如果再次调用它,它将成功执行,结束会话,创建新会话也将有效。

但你可以使用我发现here的一个技巧。你可以在异常处理程序中发出DBMS_JAVA.ENDSESSION_AND_RELATED_STATE来解决它,就像下面提到的那样

DECLARE
JAVA_SESSION_CLEARED EXCEPTION;
PRAGMA EXCEPTION_INIT(JAVA_SESSION_CLEARED, -29549);
--
V_KEEP_TRIES NUMBER := 3;
V_TMP VARCHAR2(32000);
BEGIN
<<BEFORE_JAVA_CALL>>
BEGIN

JAVA_WRAPPER_PROC;

EXCEPTION
WHEN JAVA_SESSION_CLEARED THEN
V_TMP := DBMS_JAVA.ENDSESSION_AND_RELATED_STATE;
V_KEEP_TRIES := V_KEEP_TRIES - 1;
IF V_KEEP_TRIES >= 0 THEN
GOTO BEFORE_JAVA_CALL;
ELSE
RAISE;
END IF;
WHEN OTHERS THEN
LM.SET_STATUS('FAILED', SQLERRM );
RAISE;
END;