Вам всегда приходится писать полные строки в каждом блоке PL/SQL. Wehn вы пишите
Begin
dbms_output.put_line('A' || CHR(10) || 'B');
End;
/
Вы пишете две полные строки «A» и «B» в одном блоке PL/SQL. Когда вы пишете
exec dbms_output.put_line('A' || CHR(10) || 'B');
то же самое верно.
Но когда вы пишете
exec dbms_output.put('A')
exec dbms_output.put('B')
exec dbms_output.new_line
у вас есть три отдельных блока PL/SQL. Первые два пишут частичные строки, которые будут пропущены SqlPlus. Третий блок пишет полную, но пустую строку.
Если вы пишете
begin
dbms_output.put('A');
dbms_output.put('B');
dbms_output.new_line;
end;
/
все работает, как ожидалось.
Причина в том, как работает консольный вывод в SqlPlus: PL/SQL записывает вывод в промежуточном буфере. SqlPlus извлекает содержимое этого буфера в конце каждого исполняемого блока PL/SQL. Затем он печатает этот контент на консоль, а только печатает полные строки. Следовательно, он пропускает последнюю строку в буфере, когда она не заканчивается новым символом строки.
Технически я подозреваю, что SqlPlus также печатает строки без нового символа линии, но starightaway перезаписывает их на следующем шаге. Технически SqlPlus действительно извлекает только полные строки из внутреннего буфера, используя функцию PL/SQL DBMS_OUTPUT.GET_LINES
.
На самом деле, все инструменты, имеющие возможность отображать DBMS_OUTPUT использует DBMS_OUTPUT.GET_LINES :-) –