Процедура Oracle, дающая различные выходные данные ASCII - PullRequest
0 голосов
/ 20 ноября 2018

Эта процедура печатает код 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.

Почему он заменяет 32 32 32 32 32 на 9. По сути, вкладка.

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 голосов
/ 20 ноября 2018

Это поведение по умолчанию в SQL * Plus в Unix, управляемое его tab настройкой :

SET TAB {ON |OFF}

Определяет, как 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 перед началом.

Возможно, вы захотите установить его всценарий или файл входа в систему, поэтому он всегда применяется.

(Обратите внимание, что это относится только к выводу терминала, а не к спулингу файлов; ваш вопрос относится к спулингу, но я думаю, что вы на самом деле должны перенаправлять или захватыватьвыводить другим способом.)

...