2016-02-03 2 views
1

Я создал с утверждением, такие как:цикл в заявлении С

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) 

И я хочу использовать его в цикле, как это:

BEGIN 
FOR x 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)} 
END LOOP; 
END; 

Но оракул говорит, что я нужно в этом утверждении. Что мне делать? Должен ли я использовать курсор? Как это будет выглядеть?

+0

Что именно это должно делать? кажется, что он предположительно просто запускается 100 раз – sagi

+0

Да, предположим, что нужно просто запустить 100 раз, потому что мне нужно проверить время выполнения для этого оператора – user2603622

+0

Попробуйте удалить часть, зачем она вам нужна? вы не используете его где-нибудь, где – sagi

ответ

3

Учитывая, что вам просто нужно выполнить 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; 

Пожалуйста, обратите внимание, что это не может быть лучшим способом проверить производительность запроса: после первого запуска , данные могут быть уже в кэше, поэтому следующие запуски могут быть быстрее

2

Мне нужно, чтобы проверить время работы для этого заявления

Вы предполагаете, что WITH выполняется независимо от фактического запроса, который использует, что обычно неверно. WITH будет скомпилирован вместе с частью, которая использует ее в одном плане выполнения. Если вы хотите самим проверить раздел WITH, просто возьмите линию WITH и запустите в ней `SELECT.

Однако было бы более точным запустить весь запрос или получить лучший инструмент для профилирования SQL.