【问题标题】:Oracle procedure giving different ASCII outputs给出不同 ASCII 输出的 Oracle 程序
【发布时间】:2019-04-23 02:51:39
【问题描述】:

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

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

如果通过UNIX 服务器上的SQLPLUS 执行并将DBMS_OUTPUT.PUT_LINE (v_String); 的输出假脱机到一个文本文件,复制该输出并将其分配给v_String 并在TOAD 中执行该过程,我得到以下@ 987654326@代码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;

【问题讨论】:

  • 嗯,你到底是在使用spool命令写入文件,还是将终端输出重定向到文件?

标签: oracle unix sqlplus dbms-output


【解决方案1】:

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

SET TAB {ON |关闭}

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

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

select '700       1' from dual;`

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

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

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

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

【讨论】:

    猜你喜欢
    • 2018-08-09
    • 2014-01-03
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-25
    相关资源
    最近更新 更多