您的位置:首页 > 数据库 > Oracle

oracle函数调用webservices

2014-07-09 16:54 309 查看
1,  去oracle官网上下载dbws-callout-utility-10131.zip
http://www.oracle-base.com/articles/10g/utl_dbws-10g.php

地址:http://hi.baidu.com/love_lidx/item/ce779042995612a261d7b99f

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命令(一般安装完jdk或oracle之后就会有,jar包必须为绝对地址)将jar包导入oracle对应的用户(必须为本地用户)中:

loadjava -u nsxydjdba/nsxydj123@orcl -o -r -v -f -genmissing -s -grant public D:\app\Administrator\product\11.2.0\dbhome_1\sqlj\lib\dbwsclientws.jar;

loadjava -u nsxydjdba/nsxydj123@orcl -o -r -v -f -genmissing -s -grant public D:\app\Administrator\product\11.2.0\dbhome_1\sqlj\lib\dbwsclientdb11.jar;

SYS用户,命令为:

loadjava -u sys/sys -o -r -v -f -genmissing -s -grant public D:\app\Administrator\product\11.2.0\dbhome_1\sqlj\lib\dbwsclientws.jar

loadjava -u sys/sys -o -r -v -f -genmissing -s -grant public D:\app\Administrator\product\11.2.0\dbhome_1\sqlj\lib\dbwsclientdb11.jar;

 

-o     使用OCI8 JDBC接口

-v     显示执行过程

-f     强制装载

-r     编译并解析类

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

6,  编写sql函数并发布

CREATE OR REPLACE FUNCTION add_func (str1 IN VARCHAR2,

                                        str2 IN VARCHAR2)

  RETURN VARCHAR2

AS

  xml varchar2(9000);

  l_service         sys.UTL_DBWS.service;

  l_call             sys.UTL_DBWS.call;

  l_wsdl_url         VARCHAR2(32767);

  l_namespace        VARCHAR2(32767);

  l_service_qname    sys.UTL_DBWS.qname;

  l_port_qname       sys.UTL_DBWS.qname;

  l_operation_qname  sys.UTL_DBWS.qname;

  l_xmltype_in       SYS.XMLTYPE;

  l_xmltype_out      SYS.XMLTYPE;

  l_return           VARCHAR2(32767);

 

   ---l_input_params sys.UTL_DBWS.anydata_list;

BEGIN

  xml:=str1;

  l_wsdl_url        := 'http://192.168.19.106:7001/wscxWeb_service/services/wscxWeb_service?wsdl';

  l_namespace       := 'http://service.hhzs.com';

  l_service_qname   := sys.UTL_DBWS.to_qname(l_namespace, 'wscxWeb_service');

  l_port_qname      := sys.UTL_DBWS.to_qname(l_namespace, 'wscxWeb_serviceHttpPort');

  l_operation_qname := sys.UTL_DBWS.to_qname(l_namespace, 'IwscxService_client');

  l_service := sys.UTL_DBWS.create_service (

    wsdl_document_location => URIFACTORY.getURI(l_wsdl_url),

    service_name           => l_service_qname);

  l_call := sys.UTL_DBWS.create_call (

    service_handle => l_service,

    port_name      => l_port_qname,

    operation_name => l_operation_qname);

  l_xmltype_in := SYS.XMLTYPE('<?xml version="1.0" encoding="utf-8"?>

    <IwscxService_client xmlns="' || l_namespace || '">

      <str1>' || xml || '</str1>

      <str2>' || str2 || '</str2>

    </IwscxService_client>');

  l_xmltype_out := sys.UTL_DBWS.invoke(call_Handle => l_call,

                                   request     => l_xmltype_in);

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

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

 l_return := l_xmltype_out.extract('/').getStringVal();

 --l_return := '1';

  RETURN l_return;

 

END;

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

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

begin

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

dbms_java.grant_policy_permission('NSXYDJDBA','SYS','java.io.FilePermission','*');

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

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

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

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

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

dbms_java.grant_permission( 'NSXYDJDBA', 'SYS:java.net.SocketPermission', '192.168.19.106:7002', 'connect,resolve' );

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

end;

注:

8.如果不小心将jar加载到了oracle的其他的用户下,可用dropjava 命令卸载已经加载的jar包。用法和loadjava的用户相同。

9.有帮助的语句:

SELECT owner, status, count(*) FROM DBA_OBJECTS

WHERE OBJECT_TYPE='JAVA CLASS'

GROUP BY owner, status;

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

SELECT   TEXT   FROM   ALL_SOURCE  

WHERE   TYPE   =   'PACKAGE'   and owner like '%XGXT%'

 java.lang.IllegalAccessException: java.lang.NoClassDefFoundError

10.转义字符   <<  >>

11.如果函数的参数为XML格式,需对尖括号(<>)做转义处理:

CREATE OR REPLACE FUNCTION add_func (str1 IN VARCHAR2,

                                        str2 IN VARCHAR2)

  RETURN VARCHAR2

AS

  xml varchar2(9000);

  l_service         sys.UTL_DBWS.service;

  l_call             sys.UTL_DBWS.call;

  l_wsdl_url         VARCHAR2(32767);

  l_namespace        VARCHAR2(32767);

  l_service_qname    sys.UTL_DBWS.qname;

  l_port_qname       sys.UTL_DBWS.qname;

  l_operation_qname  sys.UTL_DBWS.qname;

  l_xmltype_in       SYS.XMLTYPE;

  l_xmltype_out      SYS.XMLTYPE;

  l_return           VARCHAR2(32767);

 

   ---l_input_params sys.UTL_DBWS.anydata_list;

BEGIN

 -- xml:=str1;

  xml:=replace(str1,'<','<');

  xml:=replace(xml,'>','>');--"

  --xml:=replace(xml,'"','"');

  --return xml;

  l_wsdl_url        := 'http://192.168.19.106:7001/wscxWeb_service/services/wscxWeb_service?wsdl';

  l_namespace       := 'http://service.hhzs.com';

  l_service_qname   := sys.UTL_DBWS.to_qname(l_namespace, 'wscxWeb_service');

  l_port_qname      := sys.UTL_DBWS.to_qname(l_namespace, 'wscxWeb_serviceHttpPort');

  l_operation_qname := sys.UTL_DBWS.to_qname(l_namespace, 'IwscxService_client');

  l_service := sys.UTL_DBWS.create_service (

    wsdl_document_location => URIFACTORY.getURI(l_wsdl_url),

    service_name           => l_service_qname);

  l_call := sys.UTL_DBWS.create_call (

    service_handle => l_service,

    port_name      => l_port_qname,

    operation_name => l_operation_qname);

  l_xmltype_in := SYS.XMLTYPE('<?xml version="1.0" encoding="utf-8"?>

    <IwscxService_client xmlns="' || l_namespace || '">

      <str1>' || xml || '</str1>

      <str2>' || str2 || '</str2>

    </IwscxService_client>');

  l_xmltype_out := sys.UTL_DBWS.invoke(call_Handle => l_call,

                                   request     => l_xmltype_in);

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

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

 l_return := l_xmltype_out.extract('/').getStringVal();

 --l_return := '1';

  RETURN l_return;

 

END;

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  oracle webservice