2016-03-09 36 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; 
/