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需要完成以下的工作:
- 准备数据库(启用数据库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; |
–
相关文章:
- WebService系列:OC4J安全性提供程序
- Oracle JDeveloper 11g PLSQL Web Service
- 编写Java Web Service Proxy
- WebService系列:将PL/SQL功能发布为Web Service到OC4J
- WebService系列:为WebService添加安全性
- WebService系列:创建PL/SQL复合式数据类型Web Services
- WebService系列:Office VBA调用Web Service
- WebService系列:Office VBA调用已安全性认证的Web Service
- WebService系列:问题处理(Troubleshooting)
light.way said on 九月 7, 2010
Hi,aronezhang
有个问题请教下,在EBS 11i.5.10.2中,要在pl/sql中调用外部的webservice是不是也可以参照这篇文章,或者还有其他的方法?
aronezhang said on 九月 8, 2010
PL/SQL中调用外部webservice只能采取这种Callout的方式。