Oracle过程提供不同的ASCII输出

时间:2018-11-20 15:52:04

标签: oracle unix sqlplus dbms-output

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

如果在TOAD中执行,它将打印以下ASCII码:55 48 48 32 32 32 32 32 32 32 49

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

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

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;

1 个答案:

答案 0 :(得分:3)

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

  

SET TAB {ON | OFF}

     

确定SQL * Plus如何格式化终端输出中的空白。 response = str(api_return[0]) response.replace("false", "False") response_json = json.loads(response) 使用空格来格式化输出中的空白。 OFF使用ON字符。 TAB设置是每八个字符。 TAB的默认值取决于系统。

SQL * Plus在输出到终端时正在“有用”地替换选项卡。与PL / SQL或TAB无关-您将看到相同的内容:

dbms_output

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

在您的SQL * Plus会话中,在开始之前设置do select '700 1' from dual;`

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

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