Почему я не вижу вывода из этого блока PL / SQL? - PullRequest
4 голосов
/ 08 ноября 2010

Мне нужен пример кода.

Я пытаюсь это:

DECLARE
     var NUMBER;
 BEGIN
     /*N.B. for loop variables in pl/sql are new declarations, with scope only inside the loop */ 
     FOR var IN 0 .. 10 LOOP 
          DBMS_OUTPUT.put_line(var);
     END LOOP;

     IF (var IS NULL) THEN
          DBMS_OUTPUT.put_line('var is null');
     ELSE
          DBMS_OUTPUT.put_line('var is not null');
     END IF;
 END;

и не получаю вывод (хотя я знаю, что это не бесконечный цикл). Почему этот не печатает?

edit: непечатный код был исправлен через интерфейс менеджера баз данных.

Ответы [ 4 ]

12 голосов
/ 08 ноября 2010

LOOP без оператора EXIT - это один из способов создания бесконечного цикла в PL / SQL

BEGIN
  LOOP
    null;
  END LOOP;
END;

Вы также можете написать цикл WHILE, который никогда не заканчивается

BEGIN
  WHILE( true )
  LOOP
    NULL;
  END LOOP;
END;
5 голосов
/ 08 ноября 2010

Если ваша проблема заключается в том, что вы не получаете вывод, возможно, вы еще не включили СУБД СУБД.Вы можете сделать это с помощью:

set serveroutput on
3 голосов
/ 09 ноября 2010

Цикл, содержащий DBMS_OUTPUT.PUT_LINE, не будет бесконечным (если выход сервера включен), поскольку, в конце концов, он заполнит весь выходной буфер или доступную память. Раньше лимит составлял около 1 миллиона байт, так что он попадал бы довольно быстро. Если он заполняет всю память компьютера, это может занять довольно много времени.

В бесконечных циклах я прошел через неудачную попытку забыть перейти к следующему элементу в таблице.

DECLARE
  type typ_tab is table of varchar2(10) index by pls_integer;
  t_tab typ_tab;
  v_ind number;
BEGIN
  t_tab(10) := 'A';
  t_tab(20) := 'B';
  v_ind := t_tab.first;
  WHILE v_ind IS NOT NULL LOOP
    dbms_output.put_line(t_tab(v_ind));
    v_ind := t_tab.next(v_ind); --Forget this and it loops forever
  END LOOP;
END;

Как только они попадут в такой цикл, администратор базы данных может прервать сеанс.

2 голосов
/ 08 ноября 2010

Не знаю, зачем вам это нужно, но:

BEGIN
        WHILE  1 = 1
        LOOP
                NULL;
        END LOOP;
END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...