Вы можете использовать объект таблицы SQL, чтобы сохранить результат выбора и использовать его повторно. Он будет занимать больше памяти и, вероятно, будет эффективен, только если первый SELECT займет много времени.
CREATE TYPE tab_number IS TABLE OF NUMBER;
/
Вы бы использовали его с предложением BULK COLLECT INTO:
DECLARE
ids tab_number;
BEGIN
SELECT id BULK COLLECT INTO ids FROM table_with_ids;
SELECT * /*into ??*/
FROM table1
WHERE id IN (SELECT column_value FROM TABLE(ids));
SELECT * /*into ??*/
FROM table2
WHERE id IN (SELECT column_value FROM TABLE(ids));
END;
В версии 9i и ранее вам необходимо использовать CAST для запроса таблицы:
SELECT *
FROM table2
WHERE id IN (SELECT column_value FROM CAST (TABLE(ids) AS tab_number));
В качестве альтернативы, вы можете использовать GLOBAL TEMPORARY TABLE для хранения промежуточного набора результатов.