Questa soluzione a prima vista sembra complicata, ma in genere risolve qualsiasi intervallo. Risolvi il problema con VALUE che potrebbero interferire con qualsiasi altro intervallo.
In primo luogo creare tabella di esempio e inserire i dati:
create table test_table (col_START NUMBER, col_END NUMBER, col_MAP CHAR(1));
insert into test_table(col_START, col_END, col_MAP) values(1,10,'A');
insert into test_table(col_START, col_END, col_MAP) values(11,15,'B');
insert into test_table(col_START, col_END, col_MAP) values(5,12,'C');
Ora i dati appaiono così:
START | END | MAP
1 | 10 | A
11 | 15 | B
5 | 12 | C
Ora creare tipo di oggetto:
CREATE TYPE SampleType AS OBJECT
(
id number,
map_string varchar2(2000)
)
/
CREATE TYPE SampleTypeSet AS TABLE OF SampleType
/
e anche creare FUNZIONE pipeline:
CREATE OR REPLACE FUNCTION GET_DATA RETURN SampleTypeSet
PIPELINED
IS
l_one_row SampleType := SampleType(NULL, NULL);
BEGIN
FOR cur_data IN (select col_START, col_END, col_MAP from test_table) LOOP
FOR i IN cur_data.col_START..cur_data.col_END LOOP
l_one_row.id := i;
l_one_row.map_string := cur_data.col_MAP;
PIPE ROW(l_one_row);
END LOOP;
END LOOP;
RETURN;
END GET_DATA;
/
Infine è possibile utilizzare query semplice:
SELECT * FROM TABLE(GET_DATA());
O creare e selezionarlo dalla vista (se si desidera implementazione OGGETTO nascondere):
CREATE VIEW VIEW_ALL_DATA AS SELECT * FROM TABLE(GET_DATA());
SELECT * FROM VIEW_ALL_DATA;
Sulla base di questo mio articolo:
http://martin-mares.cz/2010/08/oracle-db-pipelined-function/
I dati (nella tabella degli intervalli) possono essere visualizzati in questo modo? (Voglio dire, quando C si estende a un altro intervallo.) START | FINE | MAP 1 | 10 | A 11 | 15 | B 5 | 14 | C –