java - Oracle 如何在从 plsql 调用 java 时导入缺少的 java 类

标签 java oracle plsql loadjava

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

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

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

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

有谁知道如何导入类?

最佳答案

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

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

关于java - Oracle 如何在从 plsql 调用 java 时导入缺少的 java 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46580998/

相关文章:

java - 如何衡量Action Class的性能?

java - 在 addHeaderView 和 addFooterView 之后设置 StaggeredGridView setAdapter

java - 使用java以表对象作为输入调用oracle存储过程

sql - 可以对未在 GROUP BY 中列出的列使用 HAVING 子句吗?

sql - PL/SQL 触发器未检测到

java - JDBC:调用外部 SQL 脚本,声明 PL/SQL 包

java - 无法从某些 wsdl 生成 java 客户端代码

java - 创建菜单但两个按钮之一无法正常工作

string - 检测重叠范围并在 oracle 中纠正

oracle - 使用 START WITH 从查询创建序列