В свете последнего обновления кажется, что вам нужно будет делать качественно разные вставки в несколько таблиц и использовать результат дорогостоящего запроса в нескольких (разных) тестах.
Всегда лучше тестировать и тестировать (сравнивать достоинства и недостатки, а также производительность временной таблицы с другими подходами). Я включу здесь альтернативный стиль, который просто вытягивает результаты в память, где их можно запрашивать по мере необходимости (или повторять, подсчитывать и т. Д.)
Пример ниже:
- Пример данных:
CREATE TABLE TABLE_1 (LOREM_IPSUM NUMBER);
INSERT INTO TABLE_1 VALUES (6);
COMMIT;
- Пользовательские типы для хранения данных
CREATE OR REPLACE TYPE EXPENSIVE_QUERY_TYPE IS OBJECT(LOREM_IPSUM NUMBER);
/
CREATE OR REPLACE TYPE EXPENSIVE_QUERY_RESULT IS TABLE OF EXPENSIVE_QUERY_TYPE;
/
- Пример блока:
DECLARE
V_EXPENSIVE_RESULT EXPENSIVE_QUERY_RESULT := EXPENSIVE_QUERY_RESULT();
V_TABLE_1_TEST INTEGER;
BEGIN
SELECT EXPENSIVE_QUERY_TYPE(LEVEL)
BULK COLLECT INTO V_EXPENSIVE_RESULT
FROM DUAL
CONNECT BY LEVEL <= 5;
SELECT COUNT(*) INTO V_TABLE_1_TEST
FROM TABLE_1
WHERE EXISTS(SELECT 1 FROM TABLE(V_EXPENSIVE_RESULT) WHERE LOREM_IPSUM = TABLE_1.LOREM_IPSUM);
IF V_TABLE_1_TEST > 0
THEN
RETURN;
ELSE
INSERT INTO TABLE_1
SELECT LOREM_IPSUM FROM TABLE(V_EXPENSIVE_RESULT)
WHERE MOD(LOREM_IPSUM,2) = 0;
END IF;
END;
/
Когда TABLE_1 изначально имеет только одну запись со значением 6, вставляются 2 и 4 (поскольку нет общих данных).
...PL/SQL procedure successfully completed.
SELECT * FROM TABLE_1;
LOREM_IPSUM
______________
2
4
6
Но если он содержит что-либо в дорогостоящем запросе (например, изначально включающему в себя и 3, и 6), ничего не вставляется:
...PL/SQL procedure successfully completed.
SELECT * FROM TABLE_1;
LOREM_IPSUM
______________
3
6