這個解決方案乍一看看起來很複雜,但通常可以解決任何範圍。解決可能會受到其他範圍干擾的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());
或創建並從視圖中選擇它(如果你想隱藏對象實現):
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/
數據(在範圍表中)看起來像這樣嗎? (我的意思是,當C延伸到另一個範圍時。) START | END |地圖 1 | 10 | A 11 | 15 | B 5 | 14 | C – 2010-08-27 13:15:10