Set Define Off
create or replace package Parse_Message


  -- Note: Oracle9i provides full functionality for
  -- parsing XML. In order to keep this code sample
  -- focused on Utl_Http, the following trivial
  -- parsing is used instead.


is
  Bad_Format exception; pragma exception_init ( Bad_Format, -20999 );

  function Verify_Format ( p_msg in varchar2, p_tag in varchar2 )
    return varchar2;

  function Extract_Value ( p_msg in varchar2, p_tag in varchar2 )
    return varchar2;
end Parse_Message;
/
Show Errors

create or replace package body Parse_Message

is

function Verify_Format ( p_msg in varchar2, p_tag in varchar2 )
  return varchar2

  -- Strips out all whitespace.
  -- Checks that the message starts and ends with the proper tags
  -- and strips them off.


is
  v_return_msg                 varchar2(32767) :=
    Replace ( Replace ( Lower(p_msg), ' ', null ), chr(10), null );

  v_close_tag                  varchar2(80) := Tags.Close ( p_tag );
  v_open_tag_length            integer      := Length ( p_tag );
  v_close_tag_length           integer      := Length ( v_close_tag );
  v_expected                   integer;

  v_errm_tag                   varchar2(80);
begin
  if not Instr ( v_return_msg, p_tag, 1, 1 ) = 1
  then
    v_errm_tag := Replace ( Replace ( p_tag, '<', '&lt;' ), '>', '&gt;' );
    raise_application_error ( -20999,
   'Verify_Format: opening ' || v_errm_tag || ' not found' );
  end if;
  v_return_msg := Substr ( v_return_msg, v_open_tag_length+1 );


  v_expected := 1 + Length (v_return_msg) - v_close_tag_length;
  if not Instr ( v_return_msg, v_close_tag, 1, 1 ) = v_expected
  then
    v_errm_tag := Replace ( Replace ( v_close_tag, '<', '&lt;' ), '>', '&gt;' );
    raise_application_error ( -20999,
   'Verify_Format: closing ' || v_errm_tag || ' not found' );
  end if;
  v_return_msg := Substr ( v_return_msg, 1, v_expected-1 );

  v_return_msg := Replace ( v_return_msg, '><', '>' || chr(10) || '<' );
  return v_return_msg;

end Verify_Format;

function Extract_Value ( p_msg in varchar2, p_tag in varchar2 )
  return varchar2
  -- expects the tag to occur only once
is
  v_return_value   varchar2(32767);
  v_start          integer;
  v_end            integer;
  v_errm_tag       varchar2(80);
begin
  v_start := Instr ( p_msg, p_tag, 1, 1 );

  if v_start < 1
  then
    v_errm_tag := Replace ( Replace ( p_tag, '<', '&lt;' ), '>', '&gt;' );
    raise_application_error ( -20999,
   'Verify_Format: opening ' || v_errm_tag || ' not found' );
  end if;
  v_start := v_start + Length(p_tag);

  v_end := Instr ( p_msg, Tags.Close(p_tag), 1, 1 );
  if v_end < 1
  then
    v_errm_tag := Replace ( Replace ( Tags.Close(p_tag), '<', '&lt;' ), '>', '&gt;' );
    raise_application_error ( -20999,

   'Verify_Format: closing ' || v_errm_tag || ' not found' );
  end if;
  v_return_value := Substr ( p_msg, v_start, v_end-v_start );
  return v_return_value;
end Extract_Value;
end Parse_Message;
/
Show Errors