【问题标题】:Calling Java from PL/SQL从 PL/SQL 调用 Java
【发布时间】:2013-09-06 06:58:12
【问题描述】:

谁能帮我解决这个问题:我想从 Pl/SQL、Oracle RDBMS 调用一个 java 程序,以下是设置

Windows 7 机器,Java 安装在 C:\Program Files\Java\jdk1.7.0_02

我创建了一个目录来保存 java 文件。 D:\Java,里面有一个hello.java文件。

public class Hello
{
  public static String world()
  {
    return "Hello world";
  }
}

编译正常,在同一目录下生成了.class文件。

由于我必须使用 PL/SQL 调用此函数,所以这是我编写的 PL/SQL 函数:

create or replace
FUNCTION helloworld RETURN VARCHAR2 AS
LANGUAGE JAVA NAME 'Hello.world () return java.lang.String';

这是 PL/SQL 过程:

create or replace
PROCEDURE hellow
AS
  my_string varchar2(400 char);
begin
  my_string:=helloworld();
  dbms_output.put_line('The value of the string is ' || my_string);
end;

使用 SQL/developer 编译的函数和过程都很好。

当我尝试运行此程序时:

set serveroutput on;
execute hellow;

出现以下错误:

Error starting at line 2 in command: execute hellow Error report: ORA-29540: class Hello does not exist ORA-06512: at "ORACLE_SOURCE.HELLOWORLD", line 1 ORA-06512: at "ORACLE_SOURCE.HELLOW", line 5 ORA-06512: at line 1
29540. 00000 -  "class %s does not exist"  
*Cause:    Java method execution failed to find a class with the indicated name.
*Action:   Correct the name or add the missing Java class.

我也将 .class 文件放在 bin 文件夹中,但仍然出现同样的错误。 任何人都可以看看这个。

【问题讨论】:

    标签: java plsql


    【解决方案1】:

    您也可以直接在数据库中编译并保存您的 java 源代码,如存储过程:

    CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED "Hello" AS
    public class Hello
    {
      public static String world()
      {
        return "Hello world";
      }
    };
    /
    
    > Java created
    

    调用这个函数很简单,不需要额外的设置:

    CREATE OR REPLACE
    FUNCTION helloworld RETURN VARCHAR2 AS
    LANGUAGE JAVA NAME 'Hello.world () return java.lang.String';
    /
    
    DECLARE
       my_string VARCHAR2(400 CHAR);
    BEGIN
       my_string := helloworld();
       dbms_output.put_line('The value of the string is ' || my_string);
    END;
    /
    
    > The value of the string is Hello world
    
    > PL/SQL procedure successfully completed
    

    【讨论】:

    • 从哪个版本的oracle数据库可以做到这一点,还有其他限制吗?
    • @SanKrish:The integrated jvm was introduced in Oracle 8i (1999)。您需要CREATE PROCEDURE 权限才能创建 java 源代码或函数。
    • @SanKrish 这是来自 sql*plus 的直接复制粘贴,它应该按原样工作。你到底得到了什么错误信息?
    • @SanKrish 这意味着它按预期工作。只需使用SET SERVEROUTPUT ON 或您客户端的等效命令来读取/启用DBMS_OUTPUT 消息。
    • @SanKrish 应该是可以的,如果你打算使用这个功能,你可能想浏览Database Java Developer's Guide
    【解决方案2】:

    在您可以调用 Oracle 数据库中的 Java 程序之前,您必须将其上传到服务器。当 PL/SQL 调用 Java 类的方法时,它是在 在 Oracle 服务器上运行的 JVM 中调用的,而不是在您的本地系统上,并且源文件必须上传到 Oracle 系统,从那里获得编译。

    使用loadjava 工具,如Java Applications on Oracle 中所述

    【讨论】:

    • 谢谢,明白了,只是一个小疑问,在我的情况下,Oracle和JVM安装在同一台机器上,但只有通过SQL开发人员将java源代码上传到oracle,这两个有什么不同?
    • Java 代码必须存储在数据库中。当您调用它时,它会在 Oracle 自己的内部 JVM 中运行。 Oracle 在其自己的数据库环境之外无法访问系统上的 Java 代码。
    • @JimGarrison 我们在哪里上传这些文件?我有jar和oracle12c同一台机器?
    【解决方案3】:

    来自http://docs.oracle.com/cd/B28359_01/java.111/b31225/chthree.htm

    使用 loadjava 工具在服务器上加载类。您必须指定用户名和密码。运行loadjava工具如下:

    loadjava -user scott Hello.class
    Password: password
    

    请参阅 URL 以获取更多信息。

    【讨论】:

    • 他不应该在 11.1 - 那里不支持 jdk 1.7(当需要加载 .class 文件时)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-12
    • 2013-01-17
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多