2016-03-09 34 views
2

我有一個帶有數值的表格,我想將這些值提取到數組中。我可以這樣做嗎?有沒有一個功能可以讓我做到這一點?我對pl/sql比較陌生,但我不知道。謝謝!將光標移到數組中

回答

2
set serveroutput on; 
DECLARE 
TYPE v_arr IS VARRAY(100) OF NUMBER; 
var v_arr; 
return_value number; 
BEGIN 
var:=v_arr(); 
FOR c1 IN (SELECT ID FROM table_name WHERE ROWNUM<100) 
loop 
var.EXTEND; 
var(var.last):=c1.id; 
end loop; 

FOR i IN var.FIRST..var.LAST 
loop 
return_value:=var(i); 
dbms_output.put_line(return_value); 
end loop; 
end; 
0

假設你的表是YOUR_TABLE,且列YOUR_COLUMN,你可以使用VARRAY數組如下:

DECLARE 
    TYPE t_ARR IS VARRRAY(1000000) OF NUMBER; 
    varr_col T_ARR; 
BEGIN 
    varr_col := t_ARR(); 
    FOR i IN (SELECT YOUR_COLUMN 
       FROM YOUR_TABLE) 
    LOOP 
    varr_col.EXTEND; 
    varr_col (1) := i.YOUR_COLUMN; 

END LOOP; 

EXCEPTION 
    --- 
END; 

這將創建可變大小的數組。每循環FOR LOOP,它都會將數組擴展一個並插入值。因此,就特定列的行數而言,它是靈活的。

+0

我有一個問題。我試圖在我有的程序上使用這段代碼,並且得到一個varr_col未初始化的錯誤。我如何初始化它? – katy

+0

@katy是的,有初始化行丟失。我添加了它。 – Hawk

0

是的,你可以使用LOOP方法,但我更喜歡BULK COLLECT INTO

下面我的小例子:

SET SERVEROUTPUT ON 
SET FEEDBACK OFF 
CLEAR 

DECLARE 
    TYPE TT_ARR IS TABLE OF NUMBER; 
    V_NUM_ARR TT_ARR; 
BEGIN 

    V_NUM_ARR := TT_ARR(); --<-- explicit initializing 

    -- LOOP approach: 
    FOR L_I IN (SELECT 1 + ROUND(DBMS_RANDOM.VALUE() * 10) COL_1 
       FROM DUAL 
       CONNECT BY LEVEL < 20) LOOP 
    V_NUM_ARR.EXTEND; 
    V_NUM_ARR(V_NUM_ARR.LAST) := L_I.COL_1; 

    END LOOP; 

    DBMS_OUTPUT.PUT_LINE('Collection size : ' || TO_CHAR(V_NUM_ARR.COUNT)); 

    -- BULK COLLECT INTO approach (preferred) 
    SELECT 1 + ROUND(DBMS_RANDOM.VALUE() * 10) COL_1 BULK COLLECT 
    INTO V_NUM_ARR 
    FROM DUAL 
    CONNECT BY LEVEL < 20; 

    DBMS_OUTPUT.PUT_LINE('Collection size : ' || TO_CHAR(V_NUM_ARR.COUNT)); 

END; 
/