我正在使用soap_api方法访问Oracle中的Web服务。当我创建add_numbers函数并执行add_numbers函数时,Function不会执行。在select语句中调用Web服务时会触发以下错误:
select add_numbers(2,5) from dual;
错误是:
ORA-30625: method dispatch on NULL SELF argument is disallowed
ORA-06512: at "TEST.SOAP_API", line 178
ORA-06512: at "TEST.ADD_NUMBERS", line 40
我正在使用此链接中的此函数和soap_api方法。摘自
的例子http://www.oracle-base.com/articles/9i/consuming-web-services-9i.php#Top
调用Web服务的功能。
FUNCTION add_numbers (p_int_1 IN NUMBER,
p_int_2 IN NUMBER)
RETURN NUMBER
AS
l_request soap_api.t_request;
l_response soap_api.t_response;
l_return VARCHAR2(32767);
l_url VARCHAR2(32767);
l_namespace VARCHAR2(32767);
l_method VARCHAR2(32767);
l_soap_action VARCHAR2(32767);
l_result_name VARCHAR2(32767);
BEGIN
l_url := 'http://192.168.1.23:8080/TestWebservice.asmx';
l_namespace := 'xmlns="http://tempuri.org/"';
l_method := 'add';
l_soap_action := 'http://tempuri.org/add';
l_result_name := 'return';
l_request := soap_api.new_request(p_method => l_method,
p_namespace => l_namespace);
soap_api.add_parameter(p_request => l_request,
p_name => 'int1',
p_type => 'xsd:integer',
p_value => p_int_1);
soap_api.add_parameter(p_request => l_request,
p_name => 'int2',
p_type => 'xsd:integer',
p_value => p_int_2);
l_response := soap_api.invoke(p_request => l_request,
p_url => l_url,
p_action => l_soap_action);
l_return := soap_api.get_return_value(p_response => l_response,
p_name => l_result_name,
p_namespace => l_namespace);
RETURN l_return;
END;
答案 0 :(得分:0)
FUNCTION get_return_value导致了问题。 在包的主体中打开那个sql文件。用下面的代码替换FUNCTION get_return_value。
FUNCTION get_return_value(p_response IN OUT NOCOPY t_response,
p_name IN VARCHAR2,
p_namespace IN VARCHAR2)
RETURN VARCHAR2 AS
-- ---------------------------------------------------------------------
BEGIN
if p_response.doc.extract('//'||p_name||'/child::text()',p_namespace).getstringval() is not null then
RETURN p_response.doc.extract('//'||p_name||'/child::text()',p_namespace).getstringval();
else return null;
END;
答案 1 :(得分:0)
关于目的地的一切确保:
l_url := 'http://192.168.1.23:8080/TestWebservice.asmx';
l_namespace := 'xmlns="http://tempuri.org/"';
l_method := 'add';
l_soap_action := 'http://tempuri.org/add';
l_result_name := 'return';
WSDL XML FILE中的内容相同