Web Service Callout的意思是在数据库中使用SQL查询、PL/SQL存储过程或Java存储过程来调用Web Service。
在Oracle Database 9.2或更高的版本中执行Web Service Callout需要完成以下的工作:
- 准备数据库(启用数据库Web Service功能),主要是装载基于Java的Web Service客户端运行环境到数据库中
- 装载Web Service的客户端代理到数据库中。生成基于Java的Web Service客户端代理、对应的Java和PL/SQL包装器,装载所有生成的对象到数据库
- 使用代理、包装器或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下载
- 10.1.3.1 Webservice Callout for 10g (R1 + R2) (ZIP, ~13MB)
- JPublisher
- OC4J
一、数据库设置
准备数据库的主要工作是装载Web Service客户端运行环境到数据库中。装载客户端运行环境需要JVM而外的内存空间来解析和存贮jar文件。
查看系统的设置,保证shared_pool_size和java_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的相关信息,如下图
通过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; |
–