This procedure prints the ASCII
code for each character in a string.
If executed in TOAD, it prints these ASCII codes: 55 48 48 32 32 32 32 32 32 32 49
which are the right ones.
If executed via SQLPLUS
on the UNIX
server and spool the output of the DBMS_OUTPUT.PUT_LINE (v_String);
to a text file, copy that output and assign it to the v_String and execute the procedure in TOAD, I get the following ASCII
codes 55 48 48 9 32 32 49
.
Why it is replacing 32 32 32 32 32 with 9. Essentially a tab.
CREATE OR REPLACE PROCEDURE My_Test
AS
v_String VARCHAR2 (25);
BEGIN
v_String := RPAD ('700', 10) || '1';
-- v_String:='700 1';
DBMS_OUTPUT.PUT_LINE (v_String);
DBMS_OUTPUT.PUT_LINE ('');
FOR i IN 1 .. LENGTH (v_String)
LOOP
DBMS_OUTPUT.PUT_LINE (ASCII (SUBSTR (v_String, i, 1)));
END LOOP;
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.PUT_LINE (SQLERRM);
END;
That is the default behaviour in SQL*Plus on Unix, controlled by its
tab
setting:SQL*Plus is 'helpfully' substituting tabs as it outputs to the terminal. It's nothing to do with PL/SQL or
dbms_output
- you would see the same thing with just:You are seeing your first three characters, then a tab instead of the five spaces to take you up to 8 characters, then the last two spaces and the final character.
In your SQL*Plus session, set do
set tab off
before you start.You might want to set that in a script, or in a login file so it's always applied.
(Note that this only applies to terminal output, not to spool files; your question refers to spooling but I think you must actually be redirecting or capturing the output some other way.)