1

此过程打印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;
4

1 回答 1

3

这是 Unix 上 SQL*Plus 的默认行为,由其tab设置控制:

设置标签 {打开 | 离开}

确定 SQL*Plus 如何格式化终端输出中的空白。OFF使用空格来格式化输出中的空白。ON使用TAB字符。TAB设置是每八个字符。的默认值TAB取决于系统。

SQL*Plus 在输出到终端时“有用地”替换制表符。这与 PL/SQL 无关,或者dbms_output- 你会看到同样的事情:

select '700       1' from dual;`

您会看到前三个字符,然后是一个制表符而不是五个空格,最多可容纳 8 个字符,然后是最后两个空格和最后一个字符。

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

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

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

于 2018-11-20T16:14:03.757 回答