2013-03-05 72 views
2

我有一個100列的表稱爲col_1,col_2,.. col_100 有沒有一種方法來選擇單列的值到100個元素的數組?選擇多列單行作爲數組的元素

(Oracle 10.2)

+0

由於SQL本身並處理數組什麼編程你有什麼語言? – 2013-03-05 14:51:19

回答

1

這是一個強力方法。有可能是一種更優雅的方式,或者至少會減少打字。本例使用五列,而不是100

DECLARE 
    -- Change VARCHAR2(10) in the next line to your col_1 .. col_100 type 
    TYPE My100Array IS TABLE OF VARCHAR2(10) INDEX BY PLS_INTEGER; 
    myVals My100Array; 
    indx NUMBER; 
BEGIN 
    SELECT 'These', 'are', 'the', 'column', 'values' 
    INTO myVals(1), myVals(2), myVals(3), myVals(4), myVals(5) 
    FROM DUAL; 
    FOR INDX IN 1..5 LOOP 
    DBMS_OUTPUT.PUT_LINE(indx || ': ' || myVals(indx)); 
    END LOOP; 
END; 

這裏的輸出,當我運行此:

1: These 
2: are 
3: the 
4: column 
5: values 

當然,這將是一個有點困難有100列,但一旦你得到查詢順便說一下,你會擁有你想要的陣列。

+0

無法使用'UNPIVOT'這是最好的答案。 – ShoeLace 2016-10-27 15:48:22

+0

實際上,你知道使用'type my100array的列的數量是VARCHAR2(10)的VARRAY(100);'也可以工作 – ShoeLace 2016-10-27 15:50:48

2

你可以只選擇他們喜歡的:

SQL> create type foo as table of number; -- or varray, as you wish. 
    2/

Type created. 

SQL> select foo(l.a, l.b, l.c) foo from your_tab l; 

FOO 
----------------- 
FOO(1, 2, 3) 

等。

0

又如:

DECLARE 
    CURSOR c_data IS 
    SELECT * FROM scott.emp; -- replace emp table with your_table 

    TYPE t_source_tab IS TABLE OF scott.emp%ROWTYPE; 
    l_tab t_source_tab; 
BEGIN 
    SELECT * BULK COLLECT INTO l_tab FROM scott.emp; 

    -- display values in array -- 
    FOR i IN l_tab.FIRST ..l_tab.LAST 
    LOOP 
     DBMS_OUTPUT.PUT_LINE (l_tab(i).hiredate ||chr(9)||l_tab(i).empno ||chr(9)||l_tab(i).ename); 
    END LOOP; 
END; 
/
0

聽起來像你想UNPIVOT數據..

不幸UNPIVOT僅在11g中添加(不是10.2) 你可以手動unpivot,但其他解決方案之一會更好地工作,我認爲。

不過,如果你是在11g或以上版本,你可以試試這個

create table my_table (col1 number,col2 number, col3 number); 
Table MY_TABLE created. 

insert into my_table values (4,5,6); 
1 row inserted. 

select * from my_table; 
     COL1  COL2  COL3 
---------- ---------- ---------- 
     4   5   6 

select val from my_table unpivot (val for col in (col1,col2,col3)); 

     VAL 
---------- 
     4 
     5 
     6 

從那裏是微不足道的,選擇到一個單柱陣列

DECLARE 
    CURSOR c_data IS 
    select val from my_table unpivot (val for col in (col1,col2,col3)); 


    TYPE t_source_tab IS TABLE OF c_data%ROWTYPE; 
    l_tab t_source_tab; 
BEGIN 

    open c_data; 
    fetch c_data bulk collect into l_tab; 
    close c_data; 

    -- display values in array -- 
    FOR i IN l_tab.FIRST ..l_tab.LAST 
    LOOP 
     DBMS_OUTPUT.PUT_LINE (l_tab(i).val); 
    END LOOP; 
END; 
/