CHR и ASCII - обрабатываем спец. символы на PL/SQL с примерами

функции CHR и ASCII PL/SQLВстроенная функция PL/SQL  CHR особенно удобна в тех случаях, когда в программный код необходимо включить ссылку на непечатаемый символ (спецсимвол). Допустим, вы строите отчет, в котором выводятся адреса компаний. Помимо строк с названиями города, страны и индекса адрес может содержать до четырех дополнительных строк, и значение каждой из них должно выводиться с новой строки. Все строки адреса можно объединить в одно длинное текстовое значение и использовать функцию CHR для вставки разрывов строк в нужных местах. В стандартной кодировке ASCII символ новой строки имеет код 10, поэтому программа может выглядеть так: 

SELECT name || CHR(10)
|| address1 || CHR(10)
|| address2 || CHR(10)
|| city || ', ' || state || ' ' || zipcode
AS company_address
FROM company

Предположим, в таблицу была вставлена следующая строка:

BEGIN
INSERT INTO company
VALUES ('Harold Henderson',
'22 BUNKER COURT',
NULL,
'WYANDANCH',
'MN',
'66557');
COMMIT;
END;
/ 

Вывод будет выглядеть примерно так:

 COMPANY_ADDRESS
--------------------
Harold Henderson
22 BUNKER COURT
WYANDANCH, MN 66557

Символ с кодом 10 обозначает разрыв строки в системах Linux и Unix. В Windows для этой цели используется комбинация символов CHR(12)||CHR(10). Возможно, в других средах вам придется использовать какие-то другие символы.

Не хотите, чтобы в выходных данных присутствовали пустые строки? Нет проблем. Задача легко решается умным использованием функции NVL2:

SELECT name
|| NVL2(address1, CHR(10) || address1, '')
|| NVL2(address2, CHR(10) || address2, '')
|| CHR(10) || city || ', ' || state || ' ' || zipcode
AS company_address
FROM company

Теперь запрос возвращает один отформатированный столбец на компанию. Функция NVL2 возвращает третий аргумент, если первый аргумент равен NULL, или второй аргумент во всех остальных случаях. В данном примере, если значение address1 равно NULL, возвращается пустая строка (''); то же самое происходит с остальными столбцами адресов.

В результате пустая строка исчезает из адреса: 

COMPANY_ADDRESS
--------------------
Harold Henderson
22 BUNKER COURT
WYANDANCH, MN 66557

Функция ASCII фактически является обратной по отношению к CHR: она возвращает десятичное представление заданного символа в наборе символов базы данных. Например, следующий фрагмент выводит десятичный код буквы «J»: 

BEGIN
DBMS_OUTPUT.PUT_LINE(ASCII('J'));
END;

Как выясняется, буква «J» (по крайней мере в кодировке UTF-8) представлена кодом 74.

Интересные примеры использования функции CHR приводятся далее, в разделе «Традиционный поиск и замена».

 

Вас заинтересует / Intresting for you:

Встроенные методы коллекций PL...
Встроенные методы коллекций PL... 14847 просмотров sepia Tue, 29 Oct 2019, 09:54:01
Управление приложениями PL/SQL...
Управление приложениями PL/SQL... 4651 просмотров Stas Belkov Thu, 16 Jul 2020, 06:20:48
Символьные функции и аргументы...
Символьные функции и аргументы... 18588 просмотров Анатолий Wed, 23 May 2018, 18:54:01
Тип данных RAW в PL/SQL
Тип данных RAW в PL/SQL 12343 просмотров Doctor Thu, 12 Jul 2018, 08:41:33
Печать
Войдите чтобы комментировать

Doc аватар
Doc ответил в теме #9086 5 года 10 мес. назад
Ага, символьные функции - это вещь. Спецсимволы часто тоже приходится обрабатывать в PL/SQL при работе с базой данных.
ildergun аватар
ildergun ответил в теме #9063 5 года 10 мес. назад
Функция CHR очень востребована в PL/SQ, поскольку спецсимволы обрабатывать приходится часто при работе с базами данных.