这个解决方案乍一看看起来很复杂,但通常可以解决任何范围。解决可能与任何其他范围干扰的 VALUE 问题。
首先创建示例表并插入数据:
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-db-pipelined-function/