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安装目录下的
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('
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('
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;