在Oracle 10g pl \ sql

时间:2016-02-10 10:22:21

标签: oracle web-services plsql

我正在使用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; 

2 个答案:

答案 0 :(得分:0)

soap_api.sql中的

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中的内容相同