Учитывая, что вам просто нужно выполнить 100-кратный один и тот же запрос, учтите, что, однако, вы должны использовать предложение INTO
, независимо от того, используете ли вы WITH
или нет.
Вы можете попробовать этот способ:
DECLARE
type tab_number is table of number;
vA tab_number;
vB tab_number;
BEGIN
FOR I IN 1 .. 100 LOOP
WITH data AS(
SELECT COUNT (*) as a, E.b as b
FROM table1 C
JOIN table2 D
ON D.MY_ID = C.MY_ID
JOIN table3 E
ON E.NEW_ID = C.NEW_ID
WHERE E.b BETWEEN 1 AND 4
GROUP BY E.b
ORDER BY E.b
)
SELECT A, B
BULK COLLECT INTO vA, vB
FROM DATA;
END LOOP;
END;
или даже без WITH
:
DECLARE
type tab_number is table of number;
vA tab_number;
vB tab_number;
BEGIN
FOR I IN 1 .. 100 LOOP
SELECT COUNT (*) as a, E.b as b
BULK COLLECT INTO vA, vB
FROM table1 C
JOIN table2 D
ON D.MY_ID = C.MY_ID
JOIN table3 E
ON E.NEW_ID = C.NEW_ID
WHERE E.b BETWEEN 1 AND 4
GROUP BY E.b
ORDER BY E.b;
END LOOP;
END;
Обратите внимание, что в этих примерах мы используем BULK COLLECT
, учитывая тх вашего запроса может вернуть более одной строки. Если вам просто нужно одну строку, вы можете удалить пункт GROUP BY
и попробовать что-то вроде следующего:
DECLARE
vA NUMBER;
BEGIN
FOR I IN 1 .. 100 LOOP
SELECT COUNT (*) as A
INTO vA
FROM table1 C
JOIN table2 D
ON D.MY_ID = C.MY_ID
JOIN table3 E
ON E.NEW_ID = C.NEW_ID
WHERE E.b BETWEEN 1 AND 4;
END LOOP;
END;
Пожалуйста, обратите внимание, что это не может быть лучшим способом проверить производительность запроса: после первого запуска , данные могут быть уже в кэше, поэтому следующие запуски могут быть быстрее
Что именно это должно делать? кажется, что он предположительно просто запускается 100 раз – sagi
Да, предположим, что нужно просто запустить 100 раз, потому что мне нужно проверить время выполнения для этого оператора – user2603622
Попробуйте удалить часть, зачем она вам нужна? вы не используете его где-нибудь, где – sagi