#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 здесь