如何部署将 BLOB 作为 Web 服务返回的 PL/SQL 函数

日期:2003 年 1 月 7 日

阅读完此方法指南后,您应该能够:

  • 发布作为 Web 服务返回大型二进制对象的 PL/SQL 函数

  • 使用 JPublisher 创建 PL/SQL 程序包的 Java 文件

  • 使用 Web Services Assembler 捆绑部署到 OC4J 的类文件

软件需求

  • 已安装示例模式的 Oracle9i 数据库版本 9.0.1 或更高版本。您可从 Oracle 技术网下载 Oracle9i Database。

  • Oracle9iAS Containers for J2EE (OC4J) 版本 9.0.2 或更高版本(可从这里得到}及 JDK 1.2 版或更高版本(可从这里得到)

  • Sun's JDK 1.3_01 版或更高版本,可从这里得到

符号解释

  • <SAMPLE_HOME> — 解压缩 Blob.jar 文件的目录。此目录包含 Blob 目录
  • <OC4J_HOME> — 安装 OC4J 的目录。例如,如果将 oc4j_extended.zip 解压缩到了 C:\OC4J,则 <OC4J_HOME> 将是C:\OC4J
  • <ORACLE_HOME> — 用于安装 Oracle9i 客户机或数据库软件的目录

简介

此文档演示如何发布作为 Web 服务返回 BLOB 的 PL/SQL 函数。BLOB 是个常用的列类型,用于存储数据库中的图像等大型内容。PL/SQL 和 JDBC 均支持 BLOB。但是 BLOB 目前还不是 Web 服务框架所支持的类型。所以需要将 BLOB 映射为支持的 Java 类型。此映射可使用 JPublisher 子类通过将 BLOB 映射为字节序列来完成。JPublisher 实用程序随 OC4J 一起提供。

此 Web 服务利用随 Oracle9i 数据库一起提供的示例模式的 PM/PM 用户中的PRINT_MEDIA 表。此表包含用于产品广告的信息。此表有一个 AD_PHOTO 列,该列包含在产品广告中用作 BLOB 列的图像。接受产品 ID 并作为 BLOB 返回其图像的 PL/SQL 函数可作为 Web 服务发布。使用 JPublisher 和 WebServices Assembler 可完成此操作。

注意:在 OC4J 9.0.4 版中,BLOB 将是 Web 服务框架所支持的类型

提取源代码

应用程序文件被存储在名为 Blob.jar 的档案中。下载该档案,并将它解压缩到方便的目录中 ( <SAMPLE_HOME>\bin)。执行以下命令,解压缩文件:

>jar xvf Blob.jar

此操作将创建 ‘Blob’ 目录并解压缩以下文件和目录:

  • src/:包含用于示例的所有 Java 源代码。
    • BlobBase.sqlj由 JPublisher 生成的 SQLJ 文件
    • BlobImp.sqlj所需方法的示例实现文件
    • BlobInter.java接口的示例实现文件
  • config/:包含配置文件。
    • CreateFunction.sql用来创建 PL/SQL 函数的 sql 脚本
    • config.xml包含 Web 服务汇编程序输入的 XML 文件
  • doc/

    • blob.html仅包含此文档。

作为 Web 服务部署 PL/SQL 过程的步骤

以下是作为 Web 服务发布 PL/SQL 函数所需的步骤顺序。

1.

通过执行位于目录 <SAMPLE_HOME>/Blob/config 中的文件 CreateFunction.sql 创建 PL/SQL 函数。

要执行脚本 CreateFunction.sql,按 pm/pm 连接您的数据库并根据 SQL 提示符运行以下命令

SQL>@<SAMPLE_HOME>/Blob/config/CreateFunction.sql                      

此操作创建一个带有函数 getAdPhoto的新程序包 AD 函数。

注意:如果用户帐户被锁定,则连接到 sytem/manager 并执行以下命令

SQL>ALTER USER pm IDENTIFIED BY pm ACCOUNT UNLOCK

2.

确保在您的 CLASSPATH 中有以下内容,这些内容为 JPublisher 所需,用来编译 SQLJ 文件。

  • SQLJ translator classes (translator.jar present at<OC4J_HOME>\sqlj\lib)
  • SQLJ runtime classes (runtime12ee.jar present at <OC4J_HOME>\sqlj\lib)
  • JDBC classes (classes12.jar  <ORACLE_HOME>\jdbc\lib)

3.

下一步使用 JPublisher 为上面创建的程序包生成 java (SQLJ) 文件。确保 PATH 中有 jpubjpub 位于 <OC4J_HOME>\bin 目录中。通过某个方便的目录给出以下命令,以生成 Java 文件。

>jpub -sql=AD:BlobBase:BlobImp -package=ad -user=pm/pm -url=jdbc:oracle:thin:@::

其中:
AD 数据库中程序包的名称
BlobBase JPub 在此生成其代码的基本类
BlobImp
存放用户代码的初始版本的子类

安装数据库的主机名称

数据库的 TNS 监听器端口

数据库名称

此操作将在同一目录中创建 BlobBase.sqlj 和 BlobImp.sqlj。JPublisher 将其代码置于 BlobBase.sqlj 中并创建一个 BlobImp.sqlj 的初始版本,在此,您也可以用自己的代码覆盖 BlobBase.sqlj 中现有的方法。

4.

使用可返回 BLOB 的 PL/SQL 函数。JPublisher 会自动将返回类型映射为 oracle.sql.BLOB。您将在 BlobBase 类中拥有以下方法:

public oracle.sql.BLOB getadphoto(Integer productid) throws SQLException

BLOB 类型不是一个可接受的 Web 服务参数。您需要创建一个函数,将 BLOB 映射为可当作 Web 服务参数接受的类型。您可以将 BLOB 映射为 byte[ ]。要做到这一点,您需要给出一种可将 BLOB 作为 byte[ ] 返回的新方法 BlobImp.sqlj,如:

public byte[] getAdPhotoAsByte(Integer productId) throws SQLException

您现在可以将此映射方法添加到 BlobImp.sqlj 中。另外,保证要有用于调用各个超类构造符的构造符。

最后,此类应该与随示例 jar 一起提供的 BlobImp.sqlj 相似。

5.

下一步,需要确保在进行 Web 服务所提供的操作时省略 getadphoto(整数 productid)方法,取而代之的是 getAdPhotoAsByte(整数 productId)方法。要达到此目的,需定义一个接口,比如 BlobInter,让它正好包含您要发布的那些方法。
您的接口必须与随示例一起提供的 BlobInter.java 中的接口相似。

6.

导航至已创建了 sqlj 和 java 文件的目录。编译 SQLJ 文件和 java 文件,以创建类文件。确保 PATH 中有 sqlj(位于<OC4J_HOME>\bin 目录中)

>javac -d .*.java
>sqlj -d .*.sqlj

此操作将创建一个目录 ‘ad’ 并将所有的类文件置于其中。

7.

创建 ad 目录的 JAR,比如 ad.jar。

>jar cvfM ad.jar ad

8

现在您可以使用 Web 服务汇编程序来创建可部署的 Web 服务企业应用档案 (EAR) 文件。
WebServicesAssembler.jar 位于<OC4J_HOME>\webservices\lib 中

您需要通过配置文件 config.xml 提供对 WebServicesAssembler.jar 的输入。示例 config.xml 位于 <SAMPLE_HOME>\Blob\config.xml 中。您可以将此 config.xml 和在上一个步骤中创建的 ad.jar 复制到 <OC4J_HOME>\webservices\lib 中。

config.xml 包含要部署的 jar、实现服务的类、接口文件、数据源等方面的信息。
提供的数据源如下所示。


jdbc/pm_ora9idb

确保将数据源的名称更改为可连接到示例模式的 PM 用户中的 AD 程序包的那一种。如果此数据源不存在,您可以通过在 <OC4J_HOME>\j2ee\home\config\data-sources.xml 中创建以下条目提供新的数据源名称。

class="oracle.jdbc.pool.OracleDataSource"
name="pm_ora9idb"
location="jdbc/pm_ora9idb"
xa-location="jdbc/xa/pm_ora9idbXADS"
ejb-location="jdbc/pm_ora9idb"
connection-driver="oracle.jdbc.driver.OracleDriver"
username="pm"
password="pm"
url="jdbc:oracle:thin:@::"
inactivity-timeout="30"
/>

注意:要为主机名、端口和 SID 添加有效值

9.

现在给出以下命令以在 <OC4J_HOME>\webservices\lib 中生成 EAR 文件

>java -jar WebServicesAssembler.jar -config config.xml

此操作可创建 ad.ear 文件。

10.

将上面创建的 ear 文件复制到:<OC4J_HOME>\j2ee\home\applications 目录。

11.

启动 OC4J 服务器。为此,请转到<OC4J_HOME>\j2ee\home 文件夹并键入以下内容

>java -jar oc4j.jar              

12.

使用以下命令从 <OC4J_HOME>\j2ee\home部署 EAR

>java -jar admin.jar ormi://: admin -deploy -file <OC4J_HOME>\webservices\lib\ad.ear -deploymentName ad

这将使用名称 “ad” 部署该应用程序

现在,使用以下命令将该 Web 应用程序绑定到网站,

>java -jar admin.jar ormi://: admin -bindWebApp ad ad_web http-web-site /BLOB


其中:
http-web-site 绑定 Web 应用程序的网站
server 该站点的主机/IP
rmi-port 该站点的 RMI 端口
password OC4J 服务器的管理员口令

13.

您可以通过打开浏览器并转到以下 URL 查看 Web 服务的工作情况

http://:/BLOB/ad

您将看到您的 Web 服务操作列表,并可通过您的浏览器分别测试这些操作。

Web 服务的终点是

http://:/BLOB/ad?WSDL

其中:
server 该站点的主机/IP
http-port 该站点的 Http 端口

Web 服务客户机将得到作为 byte[] 的图像。 GIF 文件可由此图像创建并通过图像浏览器查看。

总结

通过本文档的学习,您应该知道如何使用 JPublisher 和 Web Services Assembler 部署可作为 Web 服务返回 BLOB 的 PLSQL 函数。

参考

1. 有关如何使用 JDeveloper 作为 Web 服务部署 PLSQL 过程的信息,请参见/global/cn/tech/webservices/htdocs/series/plsql/index.html

2. 有关 Oracle9i 数据库和 Web 服务的信息,请参见/global/cn/tech/webservices/database.html


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