Как получить вывод неназванного блока PL / SQL в Oracle SQL Worksheet online? Отображается неподдерживаемая команда для SET SERVEROUTPUT На;

#oracle #plsql #dbms-output

#Oracle #plsql #dbms-output

Вопрос:

Я пытаюсь использовать PL / SQL в онлайн-Oracle SQL Worksheet — Live Oracle SQL.

Я не могу отобразить выходные данные блока, несмотря на добавление SET SERVEROUTPUT ON;

Это мой код

 SET SERVEROUTPUT ON;

declare
    i number:=2;
    j number:=0;
    counter number:=0;
    flag number;
begin
    loop
        if (i=2) then
            counter:=counter 1;
            dbms_output.put(i ||' ');

        else
            j:=2;
            flag:=0;
            loop
                if(mod(i, j)=0) then
                    flag:=1;
                end if;
                exit when (i=j) or flag=1;
            end loop;
            if(flag=0) then
                counter:=counter 1;
                dbms_output.put(j ||' ');
            end if;
        end if;
    i:=i 1;
    exit when counter=10;
    end loop;
end;
/
  

Это сообщение консоли

 Unsupported Command
Statement processed.
  

Есть идеи, как заставить это работать?

Ответ №1:

Я фактически изменил dbms_output.put() на dbms_output.put_line() , и это сработало. Есть идеи, как заставить dbms_output.put() работать?

Я хочу, чтобы выходные данные были в одной строке.

Ответ №2:

DBMS_OUTPUT выводится на консоль только тогда, когда была создана полная строка вывода. Если вы используете только DBMS_OUTPUT.PUT и не вызываете DBMS_OUTPUT.PUT_LINE or DBMS_OUTPUT.NEW_LINE , то вывод будет находиться где-нибудь в буфере, но никогда не будет записан на консоль.

Из документации Oracle [ DBMS_OUTPUT.PUT ]:

Примечания по использованию:

  • При вызове PUT_LINE за указанным вами элементом автоматически следует маркер конца строки. Если вы вызываете PUT для построения строки, то вы должны добавить свой собственный маркер конца строки, вызвав NEW_LINE . GET_LINE и GET_LINES не возвращайте строки, которые не были завершены символом новой строки.

Вы хотите добавить DBMS_OUTPUT.NEW_LINE (или DBMS_OUTPUT.PUT_LINE( NULL ) ) в конце вашего блока PL / SQL.

Упрощенная версия вашего кода (которая проверяет только нечетные числа) является:

 DECLARE
  i       PLS_INTEGER :=1;
  j       PLS_INTEGER;
  counter PLS_INTEGER :=1;
BEGIN
  DBMS_OUTPUT.PUT('2 ');
  LOOP
    i:=i 2;
    j:=3;
    LOOP
      EXIT WHEN mod(i, j)=0;
      j:= j   2;
    END LOOP;
    IF i = j THEN
      -- prime found
      DBMS_OUTPUT.PUT(i ||' ');
      counter:=counter 1;
      EXIT WHEN counter >= 10;
    END IF;
  END LOOP;
  DBMS_OUTPUT.NEW_LINE;
END;
/
  

Какие выходные данные:

 2 3 5 7 11 13 17 19 23 29 
  

Закомментируйте эту DBMS_OUTPUT.NEW_LINE; строку, и процедура ничего не выведет, поскольку буфер никогда не сбрасывается на консоль.

db<> fiddle здесь