У меня есть следующее утверждение, которое компилирует прекрасный в моем пакете:
заголовок пакета:
TYPE role_user_type IS RECORD (
ROLE_ID some_table.ROLE_ID%TYPE,
SUBGROUP some_table.USER_ID%TYPE
);
тело:
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%'
каков каркас для цикличного выполнения через ROLE_USER_REC
? мы можем даже циклично выполниться через него?
Зацикливать нечего.
role_user_type
определяет одну запись, к которой вы можете получить доступ через:
dbms_output.put_line( role_user_rec.role_id || ', ' || role_user_rec.subgroup );
Ваш SELECT ... INTO
завершится ошибкой, как только будет возвращено более одной строки.
Если вам нужно сохранить несколько из этих записей, вы можете использовать вложенные таблицы , например
TYPE role_user_tab IS ТАБЛИЦА role_user_type
:
Пример :
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;
Вы можете использовать цикл 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;
Другая альтернатива:
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;