WebService系列:PL/SQL调用Web Service(Web Service Callout)

二月 8, 2009 in Oracle 融合中间件

 

 

Web Service Callout的意思是在数据库中使用SQL查询、PL/SQL存储过程或Java存储过程来调用Web Service。

 

在Oracle Database 9.2或更高的版本中执行Web Service Callout需要完成以下的工作:

  1. 准备数据库(启用数据库Web Service功能),主要是装载基于Java的Web Service客户端运行环境到数据库中
  2. 装载Web Service的客户端代理到数据库中。生成基于Java的Web Service客户端代理、对应的Java和PL/SQL包装器,装载所有生成的对象到数据库
  3. 使用代理、包装器或DII(dynamic Invocation) APIs来调用Web Service

 

本文介绍基于Oracle Database 10.2.0,并将Web Service发布到独立的OC4J环境中。

基于Oracle Database 9.2的实现,可以参考OTN 技术文章Web Service Callout User Guide

为了实现PL/SQL调用Web Service,需要使用以下工具,从OTN下载

  1. 10.1.3.1 Webservice Callout for 10g (R1 + R2) (ZIP, ~13MB)
  2. JPublisher
  3. OC4J

 

 

一、数据库设置

 

准备数据库的主要工作是装载Web Service客户端运行环境到数据库中。装载客户端运行环境需要JVM而外的内存空间来解析和存贮jar文件。

查看系统的设置,保证shared_pool_sizejava_pool_size的设置分别大于等于96M和80M:

shared_pool_size=96M

java_pool_size=80M

 

1,装载Oracle SOAP客户端到Oracle 10g数据库

下载OC4J,解压oc4j_extended.zip文件,并将它的根目录设为环境变量ORACLE_HOME。可以将SOAP的客户端装载到SYS模式下或者一个特定的用户模式。

使用下列的命令来装载将它装载到aronehome模式下:

1
2
3
4
5
6
7
8
loadjava -u aronehome/aronehome -r -f -v -genmissing -grant public $ORACLE_HOME/webservices/lib/soap.jar ; 
loadjava -u aronehome/aronehome -r -f -v -genmissing -grant public $ORACLE_HOME/lib/dms.jar ;
loadjava -u aronehome/aronehome -r -f -v -genmissing -grant public $ORACLE_HOME/jlib/javax-ssl-1_1.jar ;
loadjava -u aronehome/aronehome -r -f -v -genmissing -grant public $ORACLE_HOME/j2ee/home/lib/servlet.jar ; 
loadjava -u aronehome/aronehome -r -f -v -genmissing -grant public $ORACLE_HOME/j2ee/home/lib/mail.jar ; 
loadjava -u aronehome/aronehome -r -f -v -genmissing -grant public $ORACLE_HOME/j2ee/home/lib/activation.jar ; 
loadjava -u aronehome/aronehome -r -f -v -genmissing -grant public $ORACLE_HOME/j2ee/home/lib/http_client.jar ; 
loadjava -u aronehome/aronehome -r -f -v -genmissing -grant public $ORACLE_HOME/j2ee/home/lib/ejb.jar ;

 

-grant public选项是将装载的Java类授权给public,使其它的模式也可以看到,如果希望是某个特定的模式使用,可以去掉它。

 

2,装载Oracle JAX-RPC客户端到Oracle 10g R2数据库

下载10.1.3.1 Webservice Callout for 10g 工具集,解压后可以看到dbwsclientws.jar和dbwsclientdb102.jar文件

使用下列的命令来装载将Oracle JAX-RPC装载到aronehome模式下:

loadjava -u aronehome/aronehome -r -v -f -genmissing -grant public dbwsclientws.jar dbwsclientdb102.jar

-grant public选项是将装载的Java类授权给public,使其它的模式也可以看到,如果希望是某个特定的模式使用,可以去掉它。

 

 

二、生成Web Service代理

 

这部分使用JPublisher来生成Web Service客户端代理

1,下载安装JPublisher。添加下列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

 

2,设置JAVA_HOME指向JDK1.4,并将JAVA_HOME/bin添加到PATH环境变量中

3,运行JPublisher来生成Web Service客户端代理和PL/SQL包装器

首先取得已发布的Web Service的描述文件(WSDL),通过Web Service的端口连接在浏览器中打开Web Service的相关信息,如下图

11.ws_endpoint

 

通过Service Description连接可以查看到WSDL文件内容,将其保存文wsdl为后缀的文件,如GreetingWordsSoapHttpPort.wsdl
运行下面的命令:

jpub -u aronehome/aronehome -sysuser sys/sys -proxywsdl=GreetingWordsSoapHttpPort.wsdl -endpoint=http://aronezhang:8888/aronehome/GreetingWordsSoapHttpPort

命令将创建Web Service客户端代理和它的Java和PL/SQL包装器,同时装载代理和包装器到数据库。命令会输入如下的信息:

1
2
3
4
5
6
7
8
9
GreetingWordsSoapHttpPortClientJPub.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 Service

 

在SQLPLUS或者PL/SQL Developer中运行Web Service的PL/SQL包装器的方法来输出欢迎语

1
2
3
4
5
SQL > conn aronehome/aronehome
SQL > select jpub_plsql_wrapper.GreetingWords('aronehome') as GreetingWords from dual;
 GreetingWords
--------------------------------------------------------------------------------
Hello aronehome, 2009-02-08

 

四、使用DII API调用Web Service

 

除了上面所描述的生成和装载客户端代理来在PL/SQL中调用Web Service外,也可以使用SYS.UTL_DBWS 包中的Web Service客户端DII APIs或者PL/SQL DII APIs来调用Web Service

前面章节中下载的JPublisher包中包括了SQL脚本utl_dbws_decl.sql 和utl_dbws_body.sql,以SYS用户运行这两个脚本。这样就可以使用SYS.UTL_DBWS来调用Web Service

下面是一段示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
DECLARE
  service_          sys.utl_dbws.service;
  call_             sys.utl_dbws.CALL;
  service_qname     sys.utl_dbws.qname;
  port_qname        sys.utl_dbws.qname;
  operation_qname   sys.utl_dbws.qname;
  string_type_qname sys.utl_dbws.qname;
  retx              anydata;
  retx_string       VARCHAR2(100);
  retx_len          NUMBER;
  params            sys.utl_dbws.anydata_list;
BEGIN
  service_qname   := sys.utl_dbws.to_qname(NULL, 'GreetingWords');
  service_        := sys.utl_dbws.create_service(service_qname);
  port_qname      := sys.utl_dbws.to_qname(NULL, 'SoapHttpPort');
  operation_qname := sys.utl_dbws.to_qname('http://com/aronehome/GreetingWords.wsdl/types/',
                                           'GreetingWordsElement');
  call_           := sys.utl_dbws.create_call(service_,
                                              port_qname,
                                              operation_qname);
  sys.utl_dbws.set_target_endpoint_address(call_,
                                           'http://AroneZhang:8888/aronehome/GreetingWordsSoapHttpPort');
  string_type_qname := sys.utl_dbws.to_qname('http://www.w3.org/2001/XMLSchema',
                                             'string');
  sys.utl_dbws.add_parameter(call_,
                             'String_1',
                             string_type_qname,
                             'ParameterMode.IN');
  sys.utl_dbws.set_return_type(call_, string_type_qname);
  params(0) := anydata.convertvarchar('Arone.Zhang');
  retx := sys.utl_dbws.invoke(call_, params);
  retx_string := retx.accessvarchar2;
  dbms_output.put_line('PL/SQL DII client return ' || retx_string);
END;

 

 

相关文章:

  1. WebService系列:OC4J安全性提供程序
  2. Oracle JDeveloper 11g PLSQL Web Service
  3. 编写Java Web Service Proxy
  4. WebService系列:将PL/SQL功能发布为Web Service到OC4J
  5. WebService系列:为WebService添加安全性
  6. WebService系列:创建PL/SQL复合式数据类型Web Services
  7. WebService系列:Office VBA调用Web Service
  8. WebService系列:Office VBA调用已安全性认证的Web Service
  9. WebService系列:问题处理(Troubleshooting)

2 responses to WebService系列:PL/SQL调用Web Service(Web Service Callout)

  1. Hi,aronezhang

    有个问题请教下,在EBS 11i.5.10.2中,要在pl/sql中调用外部的webservice是不是也可以参照这篇文章,或者还有其他的方法?

Leave a reply

You must be logged in to post a comment.