All versions of dbms_output.put_line before 10gR2 will choke if you pass in a string longer than 255 bytes. This simple print function takes a string that can be longer than 255 characters and splits it on word breaks (spaces) at the wraplength of your choice, then passes the resulting less-than-255-char lines to dbms_output.put_line .
(Of course, 1 byte = 1 character in USASCII7. I have set the maximum wraplength to 255 characters; if you are using a multibyte character set, adjust the maximum wraplength accordingly to keep dbms_output.put_line happy.)
procedure print ( mesg in varchar2, wraplength in number default null )
is
--Print out a string (can be longer than 255 characters)
piece1 varchar2(4000);
piece2 varchar2(4000);
posn number ;
wl number ;
begin
if wraplength is null then
wl := 255;
else
wl := least(wraplength,255);
end if;
if length(mesg) <= wl then
dbms_output.put_line ( mesg );
else
piece1 := mesg ;
posn := 1;
while length(piece1) > 0
loop
posn := wl;
while substr(piece1,posn-1,1) not in (' ',' ', chr(13),chr(9))
loop
posn := posn - 1;
if posn = 1 then
posn := wl;
exit;
end if;
end loop;
piece2 := substr(piece1, 1, posn-1);
dbms_output.put_line ( piece2 );
piece1 := substr(piece1, posn, length(piece1));
end loop;
end if;
exception
when others then
dbms_output.put_line ( '*** ERROR IN PRINT ***' );
dbms_output.put_line ( sqlerrm );
end print;