Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Webservices using SOAP

37 views
Skip to first unread message

sara.m...@irishlife.ie

unread,
Jul 5, 2007, 11:28:03 AM7/5/07
to
Hi,

I am trying to execute a function through a webservice using a SOAP
package and am getting the following error:ORA-30625: method dispatch
on NULL SELF argument is disallowed. I think this is to do with one of
the parameters being null but dont know how to fix this. Following is
the function:

CREATE OR REPLACE FUNCTION ILACPMSPRC.GET_GREETING_fnc (p_name IN
VARCHAR2
--, p_date VARCHAR2
, p_age VARCHAR2 )
RETURN NUMBER
AS
l_request soap_api_pkg.t_request;
l_response soap_api_pkg.t_response;
l_price NUMBER;
-- DBMS_OUTPUT.ENABLE(20000);
BEGIN
DBMS_OUTPUT.ENABLE(20000);
DBMS_OUTPUT.PUT_LINE('BEGIN');
-- Set proxy details if no direct net connection.
--UTL_HTTP.set_proxy('myproxy:4480', NULL);
--UTL_HTTP.set_persistent_conn_support(TRUE);

-- Set proxy authentication if necessary.
--soap_api.set_proxy_authentication(p_username => 'myusername',
-- p_password => 'mypassword');

l_request := soap_api_pkg.new_request(p_method => 'ns1:validate',
p_namespace => 'xmlns:ns1="http://
impl.webservice.validation.workmgt.cb.irishlife.ie/xsd"');

-- parameter 1 is name
soap_api_pkg.add_parameter(p_request => l_request,
p_name => 'workType',
p_type => 'xsd:string',
p_value => p_name);

-- parameter 2 is date
soap_api_pkg.add_parameter(p_request => l_request,
p_name => 'workItemNo',
p_type => 'xsd:string',
p_value => 'ABC');
--p_value => '2007-01-01T00:00:00Z');

-- parameter 3 is age
soap_api_pkg.add_parameter(p_request => l_request,
p_name => 'indexName',
p_type => 'xsd:string',
p_value => p_age);

l_response := soap_api_pkg.invoke(p_request => l_request,
p_url => 'http://
10.253.55.139:7400/axis2/services/ValidationService',
p_action => 'http://
10.253.55.139:7400/axis2/services/ValidationService/validate');

if l_response.doc is not null then
dbms_output.put_line('the doc is not null');
end if;
DBMS_OUTPUT.PUT_LINE ( 'p_name = ' || p_name );

*HERE* l_price := soap_api_pkg.get_return_value(p_response =>
l_response,
p_name =>
'validateResponse',
p_namespace =>
'xmlns:ns1="http://impl.webservice.validation.workmgt.cb.irishlife.ie/
xsd"');


if l_price is null then
dbms_output.put_line('opps, the price is null');
end if;

DBMS_OUTPUT.PUT_LINE('PRICE:'||l_price);

RETURN l_price;


EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(SQLCODE || ', ' || SQLERRM);
RETURN NULL;
END GET_GREETING_fnc;
/

Where HERE is marked is where the problem lies...the package body is
here:

CREATE OR REPLACE PACKAGE BODY SOAP_API_PKG AS
--
--------------------------------------------------------------------------
-- Name : http://www.oracle-base.com/dba/miscellaneous/soap_api
-- Author : DR Timothy S Hall
-- Description : SOAP related functions for consuming web services.
-- Ammedments :
-- When Who What
-- =========== ========
=================================================
-- 04-OCT-2003 Tim Hall Initial Creation
-- 23-FEB-2006 Tim Hall Parameterized the "soap" envelope tags.
-- 08-JUN-2006 Tim Hall Add proxy authentication functionality.
--
--------------------------------------------------------------------------

g_proxy_username VARCHAR2(50) := NULL;
g_proxy_password VARCHAR2(50) := NULL;


--
---------------------------------------------------------------------
PROCEDURE set_proxy_authentication(p_username IN VARCHAR2,
p_password IN VARCHAR2) AS
--
---------------------------------------------------------------------
BEGIN
g_proxy_username := p_username;
g_proxy_password := p_password;
END;
--
---------------------------------------------------------------------

--
---------------------------------------------------------------------
FUNCTION new_request(p_method IN VARCHAR2,
p_namespace IN VARCHAR2,
p_envelope_tag IN VARCHAR2 DEFAULT 'SOAP-ENV')
RETURN t_request AS
--
---------------------------------------------------------------------
l_request t_request;
BEGIN
l_request.method := p_method;
l_request.namespace := p_namespace;
l_request.envelope_tag := p_envelope_tag;
RETURN l_request;
END;
--
---------------------------------------------------------------------

--
---------------------------------------------------------------------
PROCEDURE add_parameter(p_request IN OUT NOCOPY t_request,
p_name IN VARCHAR2,
p_type IN VARCHAR2,
p_value IN VARCHAR2) AS
--
---------------------------------------------------------------------
BEGIN
p_request.body := p_request.body||'<'||p_name||' xsi:type="'||
p_type||'">'||p_value||'</'||p_name||'>';
DBMS_OUTPUT.PUT_LINE ( 'p_request.body = ' || p_request.body );
END;
--
---------------------------------------------------------------------

----
---------------------------------------------------------------------
--PROCEDURE add_parameter(p_request IN OUT NOCOPY t_request,
-- p_name IN VARCHAR2,
-- p_type IN DATE,
-- p_value IN VARCHAR2) AS
----
---------------------------------------------------------------------
--BEGIN
-- p_request.body := p_request.body||'<'||p_name||' xsi:type="'||
p_type||'">'||p_value||'</'||p_name||'>';
--END;
----
---------------------------------------------------------------------

----
---------------------------------------------------------------------
--PROCEDURE add_parameter(p_request IN OUT NOCOPY t_request,
-- p_name IN VARCHAR2,
-- p_type IN INTEGER,
-- p_value IN VARCHAR2) AS
----
---------------------------------------------------------------------
--BEGIN
-- p_request.body := p_request.body||'<'||p_name||' xsi:type="'||
p_type||'">'||p_value||'</'||p_name||'>';
--END;
----
---------------------------------------------------------------------


--
---------------------------------------------------------------------
PROCEDURE generate_envelope(p_request IN OUT NOCOPY t_request,
p_env IN OUT NOCOPY VARCHAR2) AS
--
---------------------------------------------------------------------
BEGIN
p_env := '<'||p_request.envelope_tag||':Envelope xmlns:'||
p_request.envelope_tag||'="http://schemas.xmlsoap.org/soap/envelope/"
' ||
'xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/1999/XMLSchema">' ||
'<'||p_request.envelope_tag||':Body>' ||
'<'||p_request.method||' '||p_request.namespace||' '||
p_request.envelope_tag||':encodingStyle="http://schemas.xmlsoap.org/
soap/encoding/">' ||
p_request.body ||
'</'||p_request.method||'>' ||
'</'||p_request.envelope_tag||':Body>' ||
'</'||p_request.envelope_tag||':Envelope>';
END;
--
---------------------------------------------------------------------

--
---------------------------------------------------------------------
PROCEDURE show_envelope(p_env IN VARCHAR2) AS
--
---------------------------------------------------------------------
i PLS_INTEGER;
l_len PLS_INTEGER;
BEGIN
i := 1; l_len := LENGTH(p_env);
WHILE (i <= l_len) LOOP
DBMS_OUTPUT.put_line(SUBSTR(p_env, i, 60));
i := i + 60;
END LOOP;
END;
--
---------------------------------------------------------------------

--
---------------------------------------------------------------------
PROCEDURE check_fault(p_response IN OUT NOCOPY t_response) AS
--
---------------------------------------------------------------------
l_fault_node XMLTYPE;
l_fault_code VARCHAR2(256);
l_fault_string VARCHAR2(32767);
BEGIN
dbms_output.put_line('midas8-1');
l_fault_node := p_response.doc.extract('/'||
p_response.envelope_tag||':Fault',
'xmlns:'||
p_response.envelope_tag||'="http://schemas.xmlsoap.org/soap/
envelope/');

dbms_output.put_line('midas8-2');
IF (l_fault_node IS NOT NULL) THEN
dbms_output.put_line('midas8-3');
l_fault_code := l_fault_node.extract('/'||
p_response.envelope_tag||':Fault/faultcode/child::text()',
'xmlns:'||
p_response.envelope_tag||'="http://schemas.xmlsoap.org/soap/
envelope/').getstringval();

dbms_output.put_line('midas8-4');
l_fault_string := l_fault_node.extract('/'||
p_response.envelope_tag||':Fault/faultstring/child::text()',
'xmlns:'||
p_response.envelope_tag||'="http://schemas.xmlsoap.org/soap/
envelope/').getstringval();

dbms_output.put_line('midas8-5');
--RAISE_APPLICATION_ERROR(-20000, l_fault_code || ' - ' ||
l_fault_string);
END IF;
END;
--
---------------------------------------------------------------------

--
---------------------------------------------------------------------
FUNCTION invoke(p_request IN OUT NOCOPY t_request,
p_url IN VARCHAR2,
p_action IN VARCHAR2)
RETURN t_response AS
--
---------------------------------------------------------------------
l_envelope VARCHAR2(32767);
l_http_request UTL_HTTP.req;
l_http_response UTL_HTTP.resp;
l_response t_response;
BEGIN
dbms_output.put_line('Invoking request');
dbms_output.put_line('url :'||p_url);
dbms_output.put_line('action :'|| p_action);

generate_envelope(p_request, l_envelope);
show_envelope(l_envelope);
l_http_request := UTL_HTTP.begin_request(p_url, 'POST','HTTP/1.0');
dbms_output.put_line('midas1');
IF g_proxy_username IS NOT NULL THEN
DBMS_OUTPUT.PUT_LINE('PROXY USERNAME IS NOT NULL');
UTL_HTTP.set_authentication(r => l_http_request,
username => g_proxy_username,
password => g_proxy_password,
scheme => 'Basic',
for_proxy => TRUE);
END IF;
UTL_HTTP.set_header(l_http_request, 'Content-Type', 'text/xml');
UTL_HTTP.set_header(l_http_request, 'Content-Length',
LENGTH(l_envelope));
UTL_HTTP.set_header(l_http_request, 'SOAPAction', p_action);
UTL_HTTP.write_text(l_http_request, l_envelope);
dbms_output.put_line('midas2');
l_http_response := UTL_HTTP.get_response(l_http_request);
dbms_output.put_line('midas3');
UTL_HTTP.read_text(l_http_response, l_envelope);
dbms_output.put_line('midas4');
UTL_HTTP.end_response(l_http_response);
dbms_output.put_line('midas5');
l_response.doc := XMLTYPE.createxml(l_envelope);
dbms_output.put_line('midas6');
l_response.envelope_tag := p_request.envelope_tag;
dbms_output.put_line('midas7');
l_response.doc := l_response.doc.extract('/'||
l_response.envelope_tag||':Envelope/'||l_response.envelope_tag||':Body/
child::node()',
'xmlns:'||
l_response.envelope_tag||'="http://schemas.xmlsoap.org/soap/
envelope/"');
-- show_envelope(l_response.doc.getstringval());
dbms_output.put_line('midas8');
check_fault(l_response);
dbms_output.put_line('midas9');
RETURN l_response;
END;
--
---------------------------------------------------------------------

--
---------------------------------------------------------------------
FUNCTION get_return_value(p_response IN OUT NOCOPY t_response,
p_name IN VARCHAR2,
p_namespace IN VARCHAR2)
RETURN VARCHAR2 AS
--
---------------------------------------------------------------------
BEGIN

-- RETURN p_response.doc.extract('//'||p_name||'/
child::text()',p_namespace).getstringval();
dbms_output.put_line('function');
dbms_output.put_line(p_name);

DBMS_OUTPUT.PUT_LINE (p_response.doc.extract('//'||p_name||'/
child::text()', p_namespace).getstringval());
RETURN p_response.doc.extract('//'||p_name||'/child::text()',
p_namespace).getstringval();
END;
--
---------------------------------------------------------------------

END SOAP_API_PKG;
/
Any help would be appreciated...thank you!!!

0 new messages