Oracle 如何在从 plsql 调用 java 时导入丢失的 java 类

Oracle how to import missing java classes when calling java from plsql

我正在尝试逐步编写一个 java 函数,该函数可以采用 Oracle XML (BI) Publisher 报告(不是商业智能中使用的 BI Publisher,而是 XML Publisher Oracle 应用程序使用)功能,并以 clob 形式提供报告的输出。所以基本上我想采用一个报告定义和模板来输出一个税务文件,而不是 return 税务文件变成一个 clob,然后我可以使用 PLSQL 进一步操作。如果有人知道可以执行此操作的现有功能,请告诉我。

对 Java 了解不多,我接受了这个 Stack Overflow Calling Java from PL/SQL 问题并尝试开始并扩展它。

但是我无法将某些 classes 导入到 Java 程序中。

CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED "Hello" AS
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.Serializable;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import oracle.apps.xdo.oa.schema.server.TemplateHelper;
public class Hello
{
   public static String world()
   {
      return "Hello world";
   }
};
/

如果我尝试 import oracle.apps.xdo.oa.schema.server.TemplateHelper;,Java 编译失败

JAVA SOURCE 的错误您好:

LINE/COL ERROR
-------- -----------------------------------------------------------------
0/0      Hello:13: cannot find symbol
0/0      symbol  : class TemplateHelper
0/0      1 error
0/0      import oracle.apps.xdo.oa.schema.server.TemplateHelper;
0/0      ^
0/0      location: package oracle.apps.xdo.oa.schema.server

class TemplateHelper 在服务器上的 $JAVA_TOP/oracle/apps/xdo/oa/schema/server/TemplateHelper.class 下,其中 $JAVA_TOP 包含在 CLASSPATH 中。

我也试过了

loadjava -user apps ./oracle/apps/xdo/oa/schema/server/TemplateHelper.class

但出于某种原因,这 returns

SQL Error while connecting with oci8 driver to default database: Closed Connection
exiting  : could not open connection

即使所有其他程序都可以正常连接。

有谁知道如何导入 class?

你可以试试CREATE JAVA CLASS:

CREATE OR REPLACE DIRECTORY xml_template_dir
  AS '/path/to/oracle/apps/xdo/oa/schema/server/';
/

CREATE JAVA CLASS USING BFILE (xml_template_dir, 'TemplateHelper.class' )
/

然而,虽然这可能会加载 class,但它几乎肯定会有其他依赖项,并且当您尝试使用该 class 时会失败,然后您将需要加载这些依赖项,然后依赖依赖等等...

您最好找到一个包含整个包的 JAR(或者从您现有的目录结构中自己创建包)并使用 loadjava:

loadjava -user APPS/password@sid -resolve XML_Publisher.jar

(如果您需要覆盖加载失败的现有 classes,那么您可能还需要 -force 选项。)

然后您可以使用以下方法测试是否有任何加载失败:

SELECT object_name
FROM   user_objects
WHERE  object_type = 'JAVA CLASS'
AND    status != 'VALID';

另请注意,仅仅因为 class 加载成功并不意味着它不会在您调用 class.

时产生运行时异常