2

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

我对 Java 不太了解,我从 PL/SQL问题中获取了这个 Stack Overflow Calling Java 并尝试开始并扩展它。

但是我无法将某些类导入 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

类 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

但由于某种原因,这会返回

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

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

有谁知道我如何导入课程?

4

1 回答 1

2

你可以试试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' )
/

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

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

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

(如果您需要覆盖无法加载的现有类,那么您可能也需要该-force选项。)

然后,您可以使用以下方法测试是否有任何内容无法加载:

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

还要注意,仅仅因为类加载成功并不意味着调用该类时它不会产生运行时异常。

于 2017-10-05T09:05:38.113 回答