Это решение на первый взгляд выглядит сложным, но обычно разрешает любой диапазон.Решите проблему со значениями, которые могут помешать любому другому диапазону.
Сначала создайте пример таблицы и вставьте данные:
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');
Теперь данные выглядят так:
START | END | MAP
1 | 10 | A
11 | 15 | B
5 | 12 | C
Теперь создайте тип объекта:
CREATE TYPE SampleType AS OBJECT
(
id number,
map_string varchar2(2000)
)
/
CREATE TYPE SampleTypeSet AS TABLE OF SampleType
/
А также создайте ТРУБОПРОВОДНУЮ ФУНКЦИЮ:
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;
/
Наконец, вы можете использовать простой запрос:
SELECT * FROM TABLE(GET_DATA());
Или создать и выбратьэто из поля зрения (если вы хотите скрыть реализацию OBJECT):
CREATE VIEW VIEW_ALL_DATA AS SELECT * FROM TABLE(GET_DATA());
SELECT * FROM VIEW_ALL_DATA;
На основании этой моей статьи:
http://martin -mares.cz / 2010/08 / oracle-дб-конвейерный-функция /