2014-09-08 2 views
1

У меня есть тривиальный вопрос, я еще, чтобы понять разницу между DBMS_OUTPUT.PUT_LINE() и dbms_output.put()Oracle PL/dbms_output.put_line в SQL() против dbms_output.put()

set serveroutput on size 200000 
Begin 
dbms_output.put_line('A' || CHR(10) || 'B'); 
End; 
/

exec dbms_output.put_line('A' || CHR(10) || 'B'); 

выше дает выход A и B в двух разных строках. Но

exec dbms_output.put('A') 
exec dbms_output.put('B') 
exec dbms_output.new_line 

ничего не печатает. Я использую SQL * Plus: Release 11.2.0.1.0 Production

ответ

4

Вам всегда приходится писать полные строки в каждом блоке 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.

+0

На самом деле, все инструменты, имеющие возможность отображать DBMS_OUTPUT использует DBMS_OUTPUT.GET_LINES :-) –

0

Предполагая, что вы находитесь на 11g, вы должны рассматривать процедуру PUT, так как она Устарела и больше не поддерживается Oracle. В предыдущих версиях с PUT линия еще не завершена. Поскольку он не имеет маркера конца строки, в отличие от PUT_LINE, за которым автоматически следует маркер конца строки.

Итак, , если вы добавите маркер конца строки, вы получите результат.

Вы можете посмотреть на этот старый вопрос Is dbms_output.put() being buffered differently from dbms_output.put_line()?

+0

Даже в 11g, с новой линии терминатора код работает .. –

+0

Да, конечно, он работает. Вот что я имел в виду, PUT нуждается в марке конца строки. а затем NEW_LINE, чтобы напечатать буферный вывод. –

+0

Из документов: «Процедура« PUT », которая принимает« NUMBER », устарела, а не версия, которую использует OP. То же самое верно для 'PUT_LINE'. –

Смежные вопросы