2010-07-19 10 views
6

Mam następujące oświadczenie, które kompiluje dobrze w moim pakiecie:jak napisać pętlę dla typu rekordu w Oracle

nagłówka pakietu:

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

ciało:

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%' 

co jest szkielet do przechodzenia przez ROLE_USER_REC? czy możemy go nawet przejrzeć?

Odpowiedz

14

Nie ma nic do zapętlenia.

role_user_type definiuje pojedynczy rekord, który można uzyskać dostęp poprzez:

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

Twój SELECT ... INTO zawiedzie jak tylko więcej niż jeden wiersz jest zwracana.


Jeśli trzeba przechowywać kilka z tych zapisów, można użyć nested tables jak
TYPE role_user_tab IS TABLE OF role_user_type:

Przykład:

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

Można użyć kursora do pętli:

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; 

Kolejna alternatywa:

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; 
Powiązane problemy