oracle直接调用web services

在oracle中直接调用web services怎么操作,在网上查了很久,相关资料,比较少。

在这里整理一下,给需要的童鞋们做参考。。

Windoworacle开发web services

1,  oracle官网上下载dbws-callout-utility-10131.zip

地址:http://www.oracle-base.com/articles/10g/utl_dbws10g.php

2,  解压后放到oracle安装目录下的<oracle_install_dir>/sqlj/lib中;

3, 检查数据库中有多少个java_class

select * from User_Objects t where t.object_type like '%JAVA_CLASS%' ;

4, 导入java或jar 参数说明:

在命令行中利用loadjava命令(一般安装完jdkoracle之后就会有)jar包导入oracle对应的用户中:

loadjava -u user/password@oracle -o -r -v -f -genmissing -s -grant public dbwsclientws.jar dbwsclientdb102.jar若为SYS用户,命令为:

loadjava -u user/password -o -r -v -f -genmissing -s -grant public dbwsclientws.jar dbwsclientdb102.jar

-o     使用OCI8 JDBC接口
-v     显示执行过程
-f     强制装载
-r     编译并解析类

5,  如果未发现UTL_DBWS(可以在plsql中敲入sys.若未有utl_dbws显示,则需要进行初始化),需要运行之前下载的包中dbws-callout-utility-10131/sqlj/lib/ utl_dbws_body.sqlutl_dbws_decl.sql

6,  编写sql函数并发布

create or replace function FUNC_GENERATE_LOGINNAME(content VARCHAR2,cellNumber VARCHAR2,sender VARCHAR2)

  return VARCHAR2 AS

  l_service        sys.utl_dbws.SERVICE;

  l_call           sys.utl_dbws.call;

  l_result         ANYDATA;

  l_wsdl_url       VARCHAR2(1024);

  l_service_name   VARCHAR2(200);

  l_operation_name VARCHAR2(200);

  l_input_params   sys.UTL_DBWS.anydata_list;

  l_xmltype_in       SYS.XMLTYPE;

   l_xmltype_out      SYS.XMLTYPE;

BEGIN

  l_wsdl_url       := 'http://xxxx.xxxx.xxxx.xxxx:xxxx/project/axis/services.jws?wsdl';

  l_service_name   := 'servicesService';

  l_operation_name := 'sendMessage';

  l_service        := sys.UTL_DBWS.create_service(wsdl_document_location => URIFACTORY.getURI(l_wsdl_url),

                                                  service_name           => l_service_name);

 

  l_call := sys.UTL_DBWS.create_call(service_handle => l_service,

                                     port_name      => NULL,

                                     operation_name => l_operation_name);

                                

                                

  l_input_params(1) := ANYDATA.ConvertVarchar2(content);

  l_input_params(2) := ANYDATA.ConvertVarchar2(cellNumber);

  l_input_params(3) := ANYDATA.ConvertVarchar2(sender);

 

  l_result := sys.UTL_DBWS.invoke(call_handle  => l_call,

                                  input_params => l_input_params);

  sys.UTL_DBWS.release_call(call_handle => l_call);

  sys.UTL_DBWS.release_service(service_handle => l_service);

  RETURN ANYDATA.AccessVarchar2(l_result);

EXCEPTION

  WHEN OTHERS THEN

    RETURN substr(sqlerrm, 0, 2000);

END FUNC_GENERATE_LOGINNAME;

7,看结果select func_generate_loginname('testTest','1234567','xxxxxx') from dual;

ps:对于其中出现的异常,最可能的就是出现权限不足,可以利用如下语句解决:

begin

dbms_java.grant_permission( 'DZZWPT', 'SYS:java.lang.RuntimePermission', 'getClassLoader', '' );

dbms_java.grant_policy_permission('DZZWPT','SYS','java.io.FileP ermission','*');

---dbms_java.grant_permission( 'DZZWPT','SYS:java.lang.IllegalAccessException','getClassLoader', '' );

dbms_java.grant_permission( 'DZZWPT', 'SYS:java.lang.RuntimePermission', 'accessClassInPackage.sun.util.calendar', '' );

dbms_java.grant_permission( 'DZZWPT', 'SYS:java.lang.RuntimePermission', 'setFactory', '' );

dbms_java.grant_permission( 'DZZWPT', 'SYS:java.util.PropertyPermission', 'HTTPClient.socket.idleTimeout', 'write' );

dbms_java.grant_permission( 'DZZWPT', 'SYS:java.net.SocketPermission', 'localhost', 'resolve' );

dbms_java.grant_permission( 'DZZWPT', 'SYS:java.net.SocketPermission', '192.168.21.203:80', 'connect,resolve' );

dbms_java.grant_permission( 'DZZWPT', 'SYS:java.lang.RuntimePermission', 'createClassLoader', '' );

end;

 

猜你喜欢

转载自ily.iteye.com/blog/1343891