无标题文档

Web 服务调出用户指南


Web 服务调出指的是使用 SQL 查询、PL/SQL 存储过程或 Java 存储过程从数据库调用 Web 服务。

在 Oracle 数据库 9.2 版或更高版本中执行 Web 服务调出需要以下步骤:

  1. 准备(或 Web 服务启用)数据库。通常,这通过在数据库中加载基于 Java 的 Web 服务客户端运行时来完成。
  2. 将特定 Web 服务的客户端代理加载到数据库中。生成基于 Java 的 Web 服务客户端代理、相应的 Java 和 PL/SQL 包装,并将生成的所有对象加载到数据库中。您也可以使用动态调用 (DII) API,在这种情况下,可以跳过该步骤。
  3. 使用代理或包装调用 Web 服务,或使用 DII API。

Oracle 9.2 中的 Java VM 与 JDK 1.3 兼容,同时在 Oracle 数据库 10g 中与 JDK 1.4 兼容。RDBMS 版本指示了要使用的 Web 服务客户端运行时(例如,Oracle SOAP 客户端或 Oracle JAX-RPC 客户端)。

  • Oracle SOAP 客户端是针对 JDK 1.3 构建的,并随附在 Oracle 应用服务器 (OracleAS) 9.0.4 和 10.1.2 版中。
  • Oracle JAX-RPC 客户端是针对 JDK 1.4 构建的,并随附在 OracleAS 10.1.3 版中。因此,Oracle 数据库 9.2 不支持 Oracle JAX-RPC 客户端运行时。

表 1 枚举了 Oracle 数据库版本与 Web 服务客户端运行时堆栈的受支持组合。例如,使用带有 Oracle JAX-RPC 客户端的 Oracle 9.2 或者使用带有 JAX-RPC DII 调用的 Oracle 9.2 都是不受支持的组合。

表 1 还显示了特定组合的相应步骤(例如,结合使用 Oracle 数据库 10g 与 Oracle JAX-RPC 客户端在 1.3 和 2.3 两节中介绍)。

表 1. 兼容性表


Oracle SOAP 客户端
Oracle JAX-RPC 客户端
Oracle JAX-RPC DII
数据库 9.2
受支持 (1.1 + 2.1)
不受支持
不受支持
数据库 10g
受支持 (1.2 + 2.2)
受支持 (1.3 + 2.3)
受支持 (1.2 + 3.2)


本文档提供了各种组合下的 Web 服务调出方法。本文档的结构如下:
  1. 准备数据库:描述如何基于数据库版本和 Web 服务客户端运行时堆栈为 Web 服务调出准备数据库。
  2. 生成代理:描述如何创建 Web 服务客户端代理和包装。
  3. 调用 Web 服务:描述如何使用代理、包装或 DII API 调用 Web 服务。
本文也可作为 Web 服务调出实用程序的用户指南,可以从 OTN 下载:

1. 准备数据库

准备数据库主要包括将 Web 服务客户端堆栈加载到数据库中。加载客户端要求 JavaVM 中有额外的 Java 空间,以解析和存储加载 jar 文件。确保 pfile (.ora) 中的 shared_pool_sizejava_pool_size 分别大于或等于 96M 和 80M。例如,

shared_pool_size=96M
java_pool_size=80M

根据已加载到数据库中的 Java 类的数量,这两个参数可能需要超过 96M 和 80M。如果修改了 pfile,应重新启动数据库。下面我们将分别讨论各种数据库和客户端堆栈组合。

1.1. 将 Oracle SOAP 客户端加载到 Oralce 9.2 数据库

下载 OC4J 版本 10.1.2(单机版)。展开 oc4j_extended.zip。我们将在其中展开 oc4j_extended.zip 的目录称为环境变量 ORACLE_HOME,稍后将进行讨论。您可以选择将 Oracle SOAP 客户端加载到 SYS 模式,或者加载到特定用户模式。要将客户端加载到用户模式,请运行以下命令。对于 Windows 用户,请用 %ORACLE_HOME% 替换 ${ORACLE_HOME}。

% loadjava -u scott/tiger -r -v -f -genmissing${ORACLE_HOME}/j2ee/home/lib/jssl-1_2.jar ${ORACLE_HOME}/soap/lib/soap.jar${ORACLE_HOME}/dms/lib/dms.jar ${ORACLE_HOME}/j2ee/home/lib/servlet.jar${ORACLE_HOME}/j2ee/home/lib/ejb.jar ${ORACLE_HOME}/j2ee/home/lib/mail.jar

如果用户拥有授予 public 权限的特权,则将 -grant public 添加到上面的命令,以确保其他模式可以看到加载的类。

JDeveloper 10.1.2 可以使用 Oracle SOAP 客户端运行时生成 Web 服务客户端代理。要在数据库中运行此类代理,需要将 $ORACLE_HOME/jdev/lib/jdev-rt.jar 添加到上述两个 jar 文件列表中。

注意,除了使用 OC4J 10.1.2 随附的 jar 文件以外,您还可以使用 OC4J 9.0.4 随附的 jar 文件。Oracle SOAP 客户端在 OC4J 9.0.4 和 10.1.2 中基本相同,只有一些错误修复除外。但是,目前 OTN 不再提供 OC4J 9.0.4 单机版下载。因此,我们不提供使用 OC4J 9.0.4 jar 文件的手册。

1.2. 将 Oracle SOAP 客户端加载到 Oralce 10g 数据库

下载 OC4J 10.1.2 单机版,并按照 1.1 节所述定义 ${ORACLE_HOME}。以下命令可将客户端加载到用户模式。

% loadjava -u scott/tiger -r -f -v -genmissing${ORACLE_HOME}/soap/lib/soap.jar ${ORACLE_HOME}/lib/dms.jar ${ORACLE_HOME}/jlib/javax-ssl-1_1.jar ${ORACLE_HOME}/j2ee/home/lib/servlet.jar ${ORACLE_HOME}/j2ee/home/lib/mail.jar ${ORACLE_HOME}/j2ee/home/lib/activation.jar ${ORACLE_HOME}/j2ee/home/lib/http_client.jar ${ORACLE_HOME}/j2ee/home/lib/ejb.jar

此外,如果用户拥有“Grant Public”权限,则将 -grant public 添加到上述命令,以使其他模式看见加载的类。

1.3. 将 Oracle JAX-RPC 客户端加载到 Oralce 10g 数据库

注意:
针对 10g 数据库的所有版本的调出实用程序都包括:
  • 一个供 JPublisher 生成 Web 服务客户端代理的组件
  • OracleAS 10.1.3 随附的 Oracle JAX-RPC 客户端运行时
  • OracleAS 10.1.2 随附的 Oracle SOAP 客户端运行时
       1.3.1. 将 Oracle JAX-RPC 客户端加载到 Oracle 10g 第 1 版数据库

         将 web 服务客户端加载到 SYS 模式中:
    % loadjava -u sys/change_on_install -r -v -f -genmissing s grant public dbwsclientws.jar dbwsclientdb101.jar

        或者,使用以下命令将 Web 服务客户端加载到用户模式中:
    % loadjava -u scott/tiger -r -v -f -genmissing dbwsclientws.jar dbwsclientdb101.jar
       
         前进至 2.3 节

        1.3.2. 将 Oracle JAX-RPC 客户端加载到 Oracle 10g 第 2 版数据库

    将 Web 服务客户端加载到 SYS 模式中:
     % loadjava -u sys/change_on_install -r -v -f -genmissing s grant public dbwsclientws.jar dbwsclientdb102.jar

         或者,使用以下命令将 Web 服务客户端加载到用户模式中:
     % loadjava -u scott/tiger -r -v -f -genmissing dbwsclientws.jar dbwsclientdb102.jar

          前进至 2.3 节

     如果用户拥有“Grant Public”权限,则将 -grant public 添加到上述命令,以使其他模式看见加载的类。

2. 生成代理

在本节中,我们描述了使用 JPublisher 生成 Web 服务客户端代理所需的步骤。包括:下载适当的实用程序、设置环境,以及最终运行 JPublisher。

2.1. 使用 Oracle SOAP 客户端为 Oracle 9.2 数据库生成代理

如果您尚未安装 JPublisher 10.1,请下载并安装它
 
下载并安装针对 10g RDBMS 之前版本的调出实用程序。注意,该实用程序包含 jar 文件 sqlj/lib/utl_dbws.jar,该文件是用于生成 Web 服务客户端代理的实用程序 JPublisher。

CLASSPATH 环境变量包含以下 jar 文件。
  • ${ORACLE_HOME}/sqlj/lib/utl_dbws.jar
  • ${ORACLE_HOME}/sqlj/lib/translator.jar
  • ${ORACLE_HOME}/sqlj/lib/runtime12.jar
  • ${ORACLE_HOME}/jdbc/lib/classes12.jar
设置该环境使用 JDK 1.3。例如,将 JDK 1.3 JAVA_HOME/bin 添加到 PATH 环境变量中。

下载 Web 服务 WSDL 文件,并运行 JPublisher 命令以生成客户端代理。这里,我们使用 Internet 上的一个示例 Web 服务来演示该命令。该示例服务使用以下终端为给定邮编的城市提供天气信息。

http://services.xmethods.net:80/soap/servlet/rpcrouter

要验证该服务是否可用,可以从 Web 浏览器访问上面的 URL。返回消息应该是

SOAP RPC Router
Sorry, I don't speak via HTTP GET- you have to use HTTP POST to talk to me.

虽然该服务在任何时候都不可用,但下面的示例演示了通常如何运行 JPublisher 命令实用程序。

从以下位置下载服务的 WSDL 文件 TemperatureService.wsdl


运行 JPublisher 以生成客户端代理及其 PL/SQL 包装,并将它们加载到 SCOTT 模式。如果您不在防火墙中运行,则移除 -httpproxy 选项。否则,调整 -httpproxy 设置以指向实际的 http 代理主机和端口。

% jpub -u scott/tiger -sysuser sys/change_on_install -proxywsdl=TemperatureService.wsdl -httpproxy=www-proxy.us.oracle.com:80 -endpoint=http://services.xmethods.net:80/soap/servlet/rpcrouter -proxyopts=soap,tabfun -dir=weather -plsqlpackage=soap_callout_wrapper

weather/TemperatureServiceProxyJPub.java
weather/plsql_wrapper.sql
weather/plsql_dropper.sql
weather/plsql_grant.sql
weather/plsql_revoke.sql
Executing weather/plsql_wrapper.sql
Executing weather/plsql_grant.sql
Loading weather/plsql_proxy.jar

-proxyopts=soap 选项是必需的。它指示 JPublisher 基于 Oracle SOAP 客户端运行时生成客户端代理。

运行 PL/SQL 包装以调用 Web 服务。在 SQLPLUS 中,运行 PL/SQL 包装方法以获得邮编为 97229 的地区的温度。

SQL> conn scott/tiger
SQL> select soap_callout_wrapper.gettemp('97229') from dual; SOAP_CALLOUT_WRAPPER.GETTEMP('97229')
-----------------------------------
50
该输出显示 Portland 的当前温度是 50 度。在 SQLPLUS 中,运行 PL/SQL 表函数以获得邮编区域表中指定的一系列城市的温度。

SQL> create table zipcodes(zip varchar2(5));
SQL> insert into zipcodes values('97006');
SQL> insert into zipcodes values('67003');
SQL> insert into zipcodes values('19023');
SQL> insert into zipcodes values('98271');
SQL> insert into zipcodes values('83281');
SQL> SELECT * FROM TABLE(SOAP_CALLOUT_WRAPPER.TO_TABLE_gettemp(CURSOR(SELECT * FROM zipcodes)));
SQL> P0 RES
SQL> ----------
SQL> 97006 50
SQL> 67003 63
SQL> 19023 53
SQL> 98271 48
SQL> 83281 44

该输出显示给定邮编城市的温度是 506353,等等。

2.2. 使用 Oracle SOAP 客户端为 Oracle 10g 数据库生成代理

对于使用该 Oracle SOAP 客户端的调出,请遵循下一节中的说明,但需要在 jpub 命令中指定 -proxyopts=soap,或者将 soap 添加到 -proxyopts 设置中,如 -proxyopts=soap,tabfun

2.3 使用 Oracle JAX-RPC 客户端为 Oracle 10g 数据库生成代理

下载并安装 JPublisher 10.2。将以下 jar 文件添加到 CLASSPATH 环境变量中:
  • ${ORACLE_HOME}/sqlj/lib/dbwsa.jar
  • ${ORACLE_HOME}/sqlj/lib/translator.jar
  • ${ORACLE_HOME}/sqlj/lib/runtime12.jar
  • ${ORACLE_HOME}/jdbc/lib/ojdbc14.jar
设置该环境使用 JDK1.4。如果需要,在 PATH 环境变量中包含 JDK 1.4 JAVA_HOME/bin

运行 JPublisher 以生成 Web 服务客户端代理和 PL/SQL 包装。以下是使用调出实用程序中包含的 Web 服务应用程序的示例。在生成 Web 服务客户端代理之前,我们首先将名为 javacallout 的 Web 服务应用程序部署到一个 OC4J 实例。

% java -jar $ORACLE_HOME/j2ee/home/admin_client.jar deployer:oc4j:localhost:23791 oc4jadmin welcome -file javacallout.ear -deploymentName javacallout -bindAllWebApps default-web-site

samples/javacallout.wsdl 文件是上面部署的 Web 服务的 WSDL 文件。假设将 Web 服务部署到以下终端。

http://localhost:8888/javacallout/javacallout

然后,使用命令

% jpub -u scott/tiger -sysuser sys/change_on_install -proxywsdl=sample/javacallout.wsdl -endpoint=http://localhost:8888/javacallout/javacallout

创建 Web 服务客户端代理及其 Java 和 PL/SQL 包装,随后再将代理和包装加载到数据库。上述命令的输出将是

HelloServiceEJBJPub.java
plsql_wrapper.sql
plsql_dropper.sql
plsql_grant.sql
plsql_revoke.sql
Executing plsql_dropper.sql
Executing plsql_wrapper.sql
Executing plsql_grant.sql
Loading plsql_proxy.jar

运行 PL/SQL 以调用 Web 服务。在 SQLPLUS 中,可以调用 plsql_wrapper.sql 中提供的 PL/SQL 函数。每个 PL/SQL 函数都对应于该 Web 服务中的操作。例如,命令

SQL> select jpub_plsql_wrapper.sayhello('hello') from dual;

将返回

JPUB_PLSQL_WRAPPER.SAYHELLO('HELLO')
-----------------------------------
HELLO!!You just said: hello

3. 使用 DII API 调用 Web 服务

在不生成和加载客户端代理的情况下也可以调用 Web 服务,方法是在 SYS.UTL_DBWS 中使用 Web 服务客户端 DII API 或 PL/SQL DII API。PL/SQL 用户可以使用 PL/SQL 程序包 SYS.UTL_DBWS 调用 Web 服务,该程序包可以为 JAX-RPC 动态调用 API 提供包装函数。以下过程将使用 SYS.UTL_DBWS 和 Oracle JAX-RPC 客户端为 Web 服务调出设置 Oracle 10g 数据库。
  1. 根据 1.3 节准备数据库。除了 dbwsa.jar,该下载还包含 SQL 脚本 utl_dbws_decl.sqlutl_dbws_body.sql
  2. 以 SYS 身份执行 utl_dbws_decl.sqlutl_dbws_body.sql。现在,您可以使用 SYS.UTL_DBWS 调用 Web 服务了。
SQL 脚本 samples/test-plsql-dii.sqlsamples/test-plsql-dii2.sql 将调用 javacallout.wsdl 中定义的 sayHello 操作。这两个 SQL 脚本都包含在 1.3 节中提到的下载的 zip 文件中。查看这两个脚本与 WSDL 文件的对应关系。这两个脚本输出的结果 PL/SQL DII 客户端都会返回

HELLO!!You just said: hello

有关 SYS.UTL_DBWS 的详细信息,请参阅 PL/SQL 程序包和类型参考手册 10g 第 2 版 (10.2)

4. 疑难解答

本节讨论了在 Web 服务调出中遇到的常见问题。

4.1. ORA-04031:无法分配共享内存

何时: 将 Web 服务客户端运行时加载到数据库时。
错误信息
resolving:class com/sun/msv/datatype/xsd/AnyURIType
Error while resolving com/sun/msv/datatype/xsd/AnyURIType
    ORA-04031:unable to allocate 4096 bytes of shared memory ("java pool","unknown object","joxlod exec hp","SGAClass")

resolving:class oracle/j2ee/ws/client/BasicService$HandlerRegistryImpl
Error while resolving oracle/j2ee/ws/client/BasicService$HandlerRegistryImpl
    ORA-04031:unable to allocate 16 bytes of shared memory ("shared pool","unknown object","joxlod exec hp","kglhin:temp")

resolving:class oracle/j2ee/ws/client/BasicService
Error while resolving oracle/j2ee/ws/client/BasicService
    ORA-04031:unable to allocate 16 bytes of shared memory ("shared pool","unknown object","joxlod exec hp","kglhin:temp")
The following operations failed
    class com/sun/msv/datatype/xsd/AnyURIType:resolution
    class oracle/j2ee/ws/client/BasicService$HandlerRegistryImpl:resolution
    class oracle/j2ee/ws/client/BasicService:resolution
    class oracle/j2ee/ws/client/ServiceFactoryImpl:resolution

解决方案:在 pfile 中增加 java_pool_sizeshared_pool_size,重新启动数据库,然后重新加载客户端运行时。
 

4.2. ORA-29521:无法找到引用名

何时:将 Web 服务客户端运行时加载到数据库时
错误信息
ORA-29521:referenced name javax/management/MBeanServer could not be found
ORA-29521:referenced name javax/management/ObjectName could not be found

解决方案:确保在 loadjava 命令中使用 -genmissing

4.3. 无法为给定 wsdl 文件运行 CompileTool

何时:执行 JPublisher 命令时
错误信息
ERROR:Cannot run CompileTool for the given wsdl file.请确保 sqlj/lib
/utl_dbws.jar 存在并显示在类路径中。

解决方案:运行 JPublisher 10.1 时,类路径中必须有 sqlj/lib/utl_dbws.jar。包含该文件可以修复此错误。另一个可能的原因是 -proxywsdl 设置中的 URL 带有“http://”前缀。JPublisher 10.1 无法通过 HTTP URL 正确获取 WSDL 文件。因此,需要在 -proxywsdl 设置中指定本地文件。另一个方法是,将 WSDL 文件下载到本地目录,并将该文件用于 -proxywsdl

4.4. 类文件错误或 ORA-29552:验证警告

何时:执行 JPublisher 命令时
错误信息
javacallout/src/javacallout/HelloServiceInfPortClient.java:8:cannot access oracle.webservices.transport.ClientTransport
bad class file:/oracle/product/10.2.0.1/sqlj/lib/dbwsa.jar(oracle/webservices/transport/ClientTransport.class)
class file has wrong version 48.0, should be 47.0
Please remove or make sure it appears in the correct subdirectory of the classpath.
import oracle.webservices.transport.ClientTransport;
^
1 error
No files written

相同的 JDK 问题可能会以 ORA-29552 错误的形式出现,例如,

ORA-29552:verification warning:java.lang.UnsupportedClassVersionError:GoogleSearchResult (Unsupported major.minor version 49.0)

解决方案:该错误是由于环境中的 JDK 版本比数据库 JAVAVM 的 JDK 版本高而导致的。要修复该 JDK 问题,请使用与 JAVAVM 相同的 JDK 版本。对于 Oracel 9.2 数据库,使用 JDK 1.3。对于 Oracle 10.2 数据库,使用 JDK 1.4。

4.5. 读取 WSDL 失败

何时:执行 JPublisher 命令时
错误信息

SEVERE:WSDL validation failed.WSDLException:faultCode=OTHER_ERROR:Failed to
read WSDL from http://services.xmethods.net/soap/urn:xmethods-delayed-quotes.wsd
l:Read timed out
SEVERE:Caught WSDL validation exception:WSDLException:faultCode=OTHER_ERROR:
Failed to read WSDL from http://services.xmethods.net/soap/urn:xmethods-delayed-
quotes.wsdl:Read timed out

解决方案:该错误可能是由不可用的服务或错误的代理设置而导致的。查看 WSDL 文件是否可用于您的 Web 浏览器,还要检查或添加 -httpproxy 选项。

4.6. 警告:没有 loadjava 实用程序

何时:执行 JPublisher 命令时
错误信息
WARNING:no loadjava utility.Please manually load the Java code.
java.lang.ClassNotFoundException:oracle.aurora.server.tools.loadjava.LoadJavaMa
in

解决方案:loadjava 错误是由于环境中丢失了 loadjava 客户端。默认情况下,JPublisher 需要 loadjava 实用程序加载生成的 Java 包装。或者在安装了 loadjava 的环境中运行 jpub,或者在 jpub 命令中指定“-proxyopts=noload”,以便 JPublisher 跳过加载包装这个步骤。

4.7. 以 SYSDBA 身份连接时出现错误

何时:使用连接到数据库的 JDBC 瘦驱动程序执行 JPublisher 命令时
错误信息:
Error connecting as SYSDBA.Please load the file in question manually.For automatic loading into remote databases or through thin drivers, please set up the password file for remote SYS connection according to Oracle JDBC Developer's Guide.
Error executing weather/plsql_grant.sql:null.Please run that script as SYSDBA.
Error connecting as SYSDBA.Please load the file in question manually.For automatic loading into remote databases or through thin drivers, please set up the password file for remote SYS connection according to Oracle JDBC Developer's Guide.
Error granting loading permission:null
Loading weather/plsql_proxy.jar
Error while turning off verifier
    ORA-29532:Java call terminated by uncaught Java exception:java.security.AccessControlException:the Permission (oracle.aurora.security.JServerPermission Verifier) has not been granted to SCOTT.The PL/SQL to grant this is dbms_java.grant_permission( 'SCOTT', 'SYS:oracle.aurora.security.JServerPermission', 'Verifier', '' )

Error while turning off verifier
    ORA-29532:Java call terminated by uncaught Java exception:java.security.AccessControlException:the Permission (oracle.aurora.security.JServerPermission Verifier) has not been granted to SCOTT.The PL/SQL to grant this is dbms_java.grant_permission( 'SCOTT', 'SYS:oracle.aurora.security.JServerPermission', 'Verifier', '' )

解决方案:为远程访问配置 SYS 用户名和密码。或者,忽略该错误,并将 JPublisher 生成的 SQL 脚本和包装手动加载到数据库。

4.8. 不匹配

何时:执行 JPublisher 命令时
错误信息
% jpub -proxywsdl=http://localhost:8888/PLSQLRefCurWS/PLSQLRefCurWS?wsdl 
java:No match.

解决方案:该错误是由于 shell 程序尝试将 ? 解析为通配字符而引起的。例如,引用 proxywsdl 参数应该可以解决该错误。

% jpub -proxywsdl="http://localhost:8888/PLSQLRefCurWS/PLSQLRefCurWS?wsdl

4.9. ORA-29532:Java 调用因意外的 Java 异常而中断

何时:运行 PL/SQL 包装以调用 Web 服务时
错误信息
SQL> select jpub_plsql_wrapper.sayHello('hello from outer space') from dual;
select jpub_plsql_wrapper.sayHello('hello from outer space') from dual;
                                                    *
ERROR at line 1:
ORA-29532:Java call terminated by uncaught Java exception:
java.rmi.RemoteException:Provider oracle.j2ee.ws.client.ServiceFactoryImpl not
found
ORA-06512:at "SCOTT.JPUB_PLSQL_WRAPPER", line 1
ORA-06512:at line 2

解决方案:如果 SQLPLUS 中未显示详细消息,则详细的 Java 堆栈通常位于数据库安装的日志目录中(对于 Unix 而言),或者位于 UDUMP 区域中(对于 Windows 而言)。查找包含字符串 ORA-29532 的文件。

4.10. 消息发送失败:未授予权限 (java.lang.RuntimePermission setFactory)

何时:运行 PL/SQL 包装以调用 Web 服务时
错误信息
SQL> select jpub_plsql_wrapper.checkphonenumber('6103831264','0') from dual;
select jpub_plsql_wrapper.checkphonenumber('6103831264','0') from dual
                                                                  *
ERROR at line 1:
ORA-29532:Java call terminated by uncaught Java exception:
java.rmi.RemoteException:java.rmi.RemoteException:HTTP transport error:
javax.xml.soap.SOAPException:java.security.PrivilegedActionException:
javax.xml.soap.SOAPException:Message send failed:the Permission
(java.lang.RuntimePermission setFactory) has not been granted to SCOTT.*The
PL/SQL to grant this is dbms_java.grant_permission( 'SCOTT',
'SYS:java.lang.RuntimePermission', 'setFactory', '' );* nested exception is:
HTTP transport error:javax.xml.soap.SOAPException:
java.security.PrivilegedActionException:javax.xml.soap.SOAPException:Message
send failed:the Permission (java.lang.RuntimePermission setFactory) has not
been granted to SCOTT.The PL/SQL to grant this is dbms_java.grant_permission(
'SCOTT', 'SYS:java.lang.RuntimePermission', 'setFactory', '' )

解决方案:JPublisher 生成一个带有后缀“grant.sql”的文件,它为 Web 服务调用赋予必要的权限。确保该脚本已经在 SYS 模式中正确运行。此类错误的另一个原因是 JPublisher 10.2 中的一个错误,其中特定的“setFactory”未包含在 grant.sql 文件中。该错误将在 10.2 之后的版本中修复。对于 JPubliser 10.2,请手动使用以下脚本在 SYS 模式内授予权限:

SQL> call dbms_java.grant_permission('SCOTT', 'SYS:java.lang.RuntimePermission', 'setFactory', '' );

如果 JPublisher 10.1.0.2 用于生成 PL/SQL 包装,则在 SYS 中运行以下脚本(除了运行 grant.sql 中生成的脚本之外)。

SQL> call dbms_java.grant_permission('SCOTT', 'SYS:java.lang.RuntimePermission', 'setFactory', '' );
SQL> call dbms_java.grant_permission( 'SCOTT', 'SYS:java.lang.RuntimePermission', 'shutdownHooks', '' );
SQL> call dbms_java.grant_permission( 'SCOTT', 'SYS:java.util.logging.LoggingPermission', 'control', '' );

4.11. NoClassDefFoundError

何时:运行 JPublisher 生成的 PL/SQL 包装可能提供 NoClassDefFoundError
错误信息
SQL> BEGIN DBMS_OUTPUT.PUT_LINE(JPUB_PLSQL_WRAPPER.sayHello('Andrew')); END;
/
BEGIN
*
ERROR at line 1:
ORA-29532:Java call terminated by uncaught Java exception:
java.lang.NoClassDefFoundError:generated by genmissing
ORA-06512:at "SYS.JPUB_PLSQL_WRAPPER", line 1
ORA-06512:at line 2

解决方案:查看 Unix 日志目录下的跟踪文件或 UDUMP 目录下的跟踪文件,以获取有关 NoClassDefFoundError 的详细 Java 堆栈跟踪信息。查看加载 Web 服务客户端运行时或执行 JPublisher 命令过程中的任何异常。如果这两步中未发现异常,报告一个错误。

4.12.   java.lang.ExceptionInInitializerError

何时:运行 JPublisher 生成的 PL/SQL 包装时
错误信息

ERROR at line 1:
ORA-29532:Java call terminated by uncaught Java exception:
java.lang.ExceptionInInitializerError
ORA-06512:at "SCOTT.JPUB_PLSQL_WRAPPER", line 1
ORA-06512:at line 1

解决方案:查看 Unix 日志目录下的跟踪文件或 UDUMP 目录下的跟踪文件,以获取有关 ExceptionInInitializerError 的详细 Java 堆栈跟踪信息。跟踪文件一般建议需要向运行 Web 服务客户端的模式授予一定权限。尝试以下 SQL 脚本,然后重新运行 PL/SQL 包装。


SQL> conn sys/change_on_install as sysdba
SQL> call dbms_java.grant_permission( 'SCOTT', 'SYS:java.lang.RuntimePermission', 'shutdownHooks', '' );
SQL> call dbms_java.grant_permission( 'SCOTT', 'SYS:java.util.logging.LoggingPermission', 'control', '' );

5. 本文中的更改

本文档有别于针对 10g RDBMS 之前版本的调出实用程序针对 10g (R1 + R2) RDBMS 的 10.1.3 调出实用程序以前的自述文件。以前,我们建议将 Web 服务客户端运行时加载到 SYS 模式以便使该运行时可用于其他模式。本文档建议将该客户端运行时加载到用户模式,以避免 dbwsa.jar 类在 SYS 中重写现有类。该加载模式可以为其他模式授权,以便使加载的类可用于别处。

6. 文档和链接

寄送此页面
Printer View 打印机视图