Follow along with the video below to see how to install our site as a web app on your home screen.
Note: This feature may not be available in some browsers.
col transaction_reference format a60
col subinventory_name format a17
select SUBINVENTORY_NAME, transaction_reference from MTL_TRANS
/
SUBINVENTORY_NAME TRANSACTION_REFERENCE
----------------- -------------------------------------------------------
Dave PARIS11,30,CANNES40,C22,TOULOUSE1
Amr PARIS11,30,CANNES40,C22,TOULOUSE1
Barb CAEN14,37,55,DIJON,21,D33,LIMOGES12,LYON5,201,M6,NIMES3
3 rows selected.
col emp_id format a6
col region format a20
select * from region_view
order by 1,2
/
EMP_ID REGION
------ ----------
Amr CANNES40
Amr CANNESC22
Amr PARIS11
Amr PARIS30
Amr TOULOUSE1
Barb CAEN14
Barb CAEN37
Barb CAEN55
Barb DIJON
Barb DIJON21
Barb DIJOND33
Barb LIMOGES12
Barb LYON5
Dave CANNES40
Dave CANNESC22
Dave PARIS11
Dave PARIS30
Dave TOULOUSE1
18 rows selected.
create or replace synonym many_rows for sys.all_tab_columns
/
Synonym created.
create or replace view employees as
select SUBINVENTORY_NAME id, transaction_reference region
from MTL_TRANS
/
View created.
create or replace package region_pack is
num_regions number;
hold_emp employees%rowtype;
hold_id varchar2(20);
hold_remaining_str varchar2(1000);
next_piece varchar2(100);
current_region varchar2(100);
current_prefix varchar2(100);
first_time boolean := true;
cursor e is select * from employees;
function get_num_regions return number;
function get_emp_id return varchar2;
function get_region return varchar2;
end;
/
Package created.
create or replace package body region_pack is
procedure get_next_rec is
begin
if not region_pack.e%isopen then
open region_pack.e;
end if;
fetch e INTO hold_emp;
if region_pack.e%notfound then
close region_pack.e;
hold_id := null;
hold_remaining_str := null;
first_time := true;
else
hold_id :=hold_emp.id;
hold_remaining_str :=hold_emp.region;
end if;
end;
function get_num_regions return number is
begin
if num_regions is null then
select sum(length(region)-length(translate(region,'x,','x')))
into num_regions
from employees;
end if;
return num_regions;
end;
function get_next_parse return varchar2 is
comma_loc number;
begin
comma_loc := instr(hold_remaining_str,',');
if comma_loc > 0 then
next_piece := substr(hold_remaining_str,1,comma_loc-1);
hold_remaining_str := substr(hold_remaining_str,comma_loc+1);
else
next_piece := hold_remaining_str;
get_next_rec;
end if;
if length(next_piece) > 4 then
current_region := next_piece;
current_prefix := translate(next_piece,'x0123456789','x');
else
current_region := current_prefix||next_piece;
end if;
return current_region;
end;
function get_emp_id return varchar2 is
begin
if first_time then
get_next_rec;
first_time := false;
end if;
return hold_id;
end;
function get_region return varchar2 is
begin
if first_time then
get_next_rec;
first_time := false;
end if;
return get_next_parse;
end;
end;
/
Package body created.
*****************************************************************************
create or replace view region_view as
select to_number(region_pack.get_emp_id) emp_id
,region_pack.get_region region
from many_rows
where rownum <= region_pack.get_num_regions
/
View created.
create or replace package body region_pack is
procedure get_next_rec is
begin
if not region_pack.e%isopen then
open region_pack.e;
end if;
fetch e INTO hold_emp;
if region_pack.e%notfound then
close region_pack.e;
hold_id := null;
hold_remaining_str := null;
first_time := true;
else
hold_id :=hold_emp.id;
hold_remaining_str :=hold_emp.region;
end if;
end;
function get_num_regions return number is
begin
if num_regions is null then
select sum(length(region)-length(translate(region,'x,','x')))[b]+count(*)[/b]
into num_regions
from employees;
end if;
return num_regions;
end;
function get_next_parse return varchar2 is
comma_loc number;
begin
comma_loc := instr(hold_remaining_str,',');
if comma_loc > 0 then
next_piece := substr(hold_remaining_str,1,comma_loc-1);
hold_remaining_str := substr(hold_remaining_str,comma_loc+1);
else
next_piece := hold_remaining_str;
get_next_rec;
end if;
if length(next_piece) > 4 then
current_region := next_piece;
current_prefix := translate(next_piece,'x0123456789','x');
else
current_region := current_prefix||next_piece;
end if;
return current_region;
end;
function get_emp_id return varchar2 is
begin
if first_time then
get_next_rec;
first_time := false;
end if;
return hold_id;
end;
function get_region return varchar2 is
begin
if first_time then
get_next_rec;
first_time := false;
end if;
return get_next_parse;
end;
end;
/
col emp_id format a6
col region format a20
select * from region_view
order by 1,2
/
EMP_ID REGION
------ ----------
Amr CANNES40
Amr CANNESC22
Amr PARIS11
Amr PARIS30
Amr TOULOUSE1
Barb CAEN14
Barb CAEN37
Barb CAEN55
Barb DIJON
Barb DIJON21
Barb DIJOND33
Barb LIMOGES12
Barb LYON201
Barb LYON5
Barb LYONM6
Barb NIMES3
Dave CANNES40
Dave CANNESC22
Dave PARIS11
Dave PARIS30
Dave TOULOUSE1
21 rows selected.
select 'TEST' from many_rows
where rownum <= region_pack.get_num_regions
/
set define off
UPDATE MTL_TRANS
SET transaction_reference = translate (transaction_reference,'-/&',',,,')
WHERE transaction_reference like '%-%'
or transaction_reference like '%/%'
or transaction_reference like '%&%'
/
commit
/