在oracle的包里面调用delphi开发的一个webservice,第一次调用可以成功,然后就报错ORA-29532: Java 调用被未捕获的 Java 异常错误终止: HTTP transport error: javax.xml.soap.SOAPException: java.security.PrivilegedActionException: oracle.j2ee.ws.saaj.ContentTypeException: Not a valid SOAP Content-Type: text/html
必须要断开oracle然后重新连接才可以,但是其他的开发工具调用确正常。
同样的写法,调用java开发的webservice就没有问题。
代码是这样的:
create or replace FUNCTION add_func1 (str1 IN VARCHAR2,
str2 IN VARCHAR2)
RETURN VARCHAR2
AS
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;
l_wsdl_url varchar2(32767);
l_namespace varchar2(32767);
l_service varchar2(32767);
l_port varchar2(32767);
l_operation varchar2(32767);
BEGIN
l_wsdl_url := 'http://192.168.4.130/card_ws1.dll/soap/Iws_1';
l_namespace := 'ws_1Intf-Iws_1';
l_service := 'Iws_1service';
l_port := 'Iws_1Port';
l_operation := 'check_card';
service_qname := sys.utl_dbws.to_qname(l_namespace, l_service);
service_ := sys.utl_dbws.create_service(service_qname);
port_qname := sys.utl_dbws.to_qname(l_namespace, l_port);
operation_qname := sys.utl_dbws.to_qname(l_namespace, l_operation);
call_ := sys.utl_dbws.create_call(service_, port_qname, operation_qname);
sys.utl_dbws.set_target_endpoint_address(call_, l_wsdl_url);
sys.utl_dbws.set_property(call_, 'ENCODINGSTYLE_URI', 'http://schemas.xmlsoap.org/soap/encoding/');
sys.utl_dbws.set_property(call_, 'OPERATION_STYLE', 'rpc');
-- sys.utl_dbws.set_property(call_, 'SOAPACTION_URI', l_namespace || '#' || l_operation);
-- sys.utl_dbws.set_property(call_, 'SOAPACTION_USE', 'true');
string_type_qname := sys.utl_dbws.to_qname('xsd', 'string');
sys.utl_dbws.add_parameter(call_, 'cardid', string_type_qname, 'ParameterMode.IN');
sys.utl_dbws.add_parameter(call_, 'hostname', string_type_qname, 'ParameterMode.IN');
sys.utl_dbws.set_return_type(call_, string_type_qname);
params(0) := ANYDATA.convertvarchar(str1);
params(1) := ANYDATA.convertvarchar(str2);
retx := sys.utl_dbws.invoke(call_, params);
sys.utl_dbws.release_call(call_handle => call_);
sys.utl_dbws.release_service(service_handle => service_);
retx_string := retx.accessvarchar2;
return ANYDATA.AccessVarchar2(retx);
END;