2010-07-19 11 views
6

Ho la seguente dichiarazione, che compila bene nel mio pacchetto:come scrivere ciclo per un tipo di record in Oracle

pacchetto intestazione:

TYPE role_user_type IS RECORD (
     ROLE_ID  some_table.ROLE_ID%TYPE, 
     SUBGROUP  some_table.USER_ID%TYPE 
    ); 

corpo:

ROLE_USER_REC     MY_PACKAGE.ROLE_USER_TYPE; 

SELECT B.USER_ID, B.ROLE INTO ROLE_USER_REC 
FROM some_table where user_id like 'M%' 

ciò che è lo scheletro per il ciclo attraverso ROLE_USER_REC? possiamo persino passarci sopra?

risposta

14

Non c'è niente da ripetere.

role_user_type definisce un singolo record, che è possibile accedere tramite:

dbms_output.put_line(role_user_rec.role_id || ', ' || role_user_rec.subgroup); 

tuo SELECT ... INTO fallirà non appena più di una riga viene restituita.


Se avete bisogno di memorizzare molti di quei dischi, è possibile utilizzare nested tables come
TYPE role_user_tab IS TABLE OF role_user_type:

Esempio:

DECLARE 
    TYPE role_user_type IS RECORD (
    ROLE_ID  VARCHAR2(10), 
    SUBGROUP  VARCHAR2(10) 
); 
    TYPE role_user_tab IS TABLE OF role_user_type; 
    role_user_rec role_user_tab; 
BEGIN 
    SELECT 'A', 'B' 
    BULK COLLECT INTO role_user_rec 
    FROM dual; 
    FOR i IN role_user_rec.FIRST .. role_user_rec.LAST LOOP 
    dbms_output.put_line(role_user_rec(i).role_id || ', ' || role_user_rec(i).subgroup); 
    END LOOP; 
END; 
5

È possibile utilizzare un cursore ciclo FOR:

BEGIN 
    FOR role_user_type IN ('SELECT B.USER_ID, B.ROLE FROM some_table where user_id like ''M%'') 
    LOOP 
    dbms_output.put_line('User ID: '||role_user_type.user_id); 
    etc... 
    END LOOP; 
END; 

Un'altra alternativa:

DECLARE 
    CURSOR C IS 
SELECT B.USER_ID, B.ROLE 
    FROM some_table 
where user_id like 'M%'; 
BEGIN 
    FOR role_user_type IN C LOOP 
    dbms_output.put_line('User ID: '||role_user_type.user_id); 
    etc... 
    END LOOP; 
END; 
Problemi correlati