Встроенная функция 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 приводятся далее, в разделе «Традиционный поиск и замена».