Oracle 过程给出不同的 ASCII 输出

Oracle procedure giving different ASCII outputs

此过程打印字符串中每个字符的 ASCII 代码。

如果在 TOAD 中执行,它会打印这些 ASCII 代码:55 48 48 32 32 32 32 32 32 32 49 这是正确的代码。

如果通过 SQLPLUSUNIX 服务器上执行并将 DBMS_OUTPUT.PUT_LINE (v_String); 的输出假脱机到文本文件,复制该输出并将其分配给 v_String并在 TOAD 中执行程序,我得到以下 ASCII 代码 55 48 48 9 32 32 49.

为什么要用 9 替换 32 32 32 32 32。本质上是一个制表符。

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;

这是 SQL*Plus 在 Unix 上的默认行为,由 its tab setting 控制:

SET TAB {ON | OFF}

Determines how SQL*Plus formats white space in terminal output. OFF uses spaces to format white space in the output. ON uses the TAB character. TAB settings are every eight characters. The default value for TAB is system dependent.

SQL*Plus 是 'helpfully' 在输出到终端时替换制表符。这与 PL/SQL 或 dbms_output 无关 - 你会看到同样的事情:

select '700       1' from dual;`

您看到的是前三个字符,然后是制表符而不是五个空格(最多 8 个字符),然后是最后两个空格和最后一个字符。

在您的 SQL*Plus 会话中,在开始之前设置 set tab off

您可能希望在脚本或登录文件中进行设置,以便始终应用。

(请注意,这仅适用于终端输出,不适用于假脱机文件;您的问题是指假脱机,但我认为您实际上必须以其他方式重定向或捕获输出。)