Esta solución a primera vista parece complicada, pero generalmente resuelve cualquier rango. Resuelve el problema con VALUE que pueden interferir con cualquier otro rango.
En primer lugar crear tabla de ejemplo e insertar datos:
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');
Ahora, los datos se ven así:
START | END | MAP
1 | 10 | A
11 | 15 | B
5 | 12 | C
Ahora crea tipo de objeto:
CREATE TYPE SampleType AS OBJECT
(
id number,
map_string varchar2(2000)
)
/
CREATE TYPE SampleTypeSet AS TABLE OF SampleType
/
y también crear FUNCIÓN 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;
/
Finalmente, puede utilizar consulta sencilla:
SELECT * FROM TABLE(GET_DATA());
O crear y seleccionar de la vista (si desea ocultar implementación del objeto):
CREATE VIEW VIEW_ALL_DATA AS SELECT * FROM TABLE(GET_DATA());
SELECT * FROM VIEW_ALL_DATA;
En base a esta mi artículo:
http://martin-mares.cz/2010/08/oracle-db-pipelined-function/
¿Pueden los datos (en la tabla de rangos) tener este aspecto? (Es decir, cuando C se extiende a otro rango.) START | END | MAPA 1 | 10 | A 11 | 15 | B 5 | 14 | C –