declare
string varchar2(4000);
v_objstate number;
v_name varchar2(100);
v_description varchar2(100);
v_partnumber varchar2(100);
v_qty number;
v_all_rows varchar2(4000);
v_row varchar2(4000);
begin
string := 'VM4 SPLA - WI NS V R STD #P59- 9 9 99 QTY 2 : S P LA - W IN SV RENT #P39-9999 QTY 3 : SPL A - WIN S VR SMB # P 3 9- 999 99 QTY 5 1';
v_objstate := to_number(regexp_substr(string, '\d+$'));
v_all_rows := regexp_replace(string, '\d+$');
v_name := regexp_substr(v_all_rows, '\S+');
v_all_rows := regexp_replace(v_all_rows, '^\s*\S+');
for rec in (
select regexp_substr(v_all_rows, '[^:]+', 1, level) as next_row
from dual connect by null is null
) loop
v_row := trim(rec.next_row);
exit when v_row is null;
v_qty := to_number(trim(regexp_substr(v_row, '\d+\s*$')));
v_row := regexp_replace(v_row, 'QTY\s*\d+\s*$');
v_partnumber := trim(regexp_replace(v_row, '^.*#'));
v_description := trim(regexp_replace(v_row, '#.*?$'));
insert into your_table (name, description, partnumber, Qty, objectstate)
values (v_name, v_description, v_partnumber, v_qty, v_objstate);
end loop;
end;