Шаг 72 - PL/SQL - функции, преобразования TO_CHAR(...) числа

Теперь давайте рассмотрим особенности работы с функцией TO_CHAR() применительно к преобразованию, чисел. При выполнении этой операции функция имеет следующий синтаксис:

TO_CHAR(число, [, формат[, nls_параметр]])

При этом функция TO_CHAR() преобразует тип NUMBER в тип VARCHAR2. В таблице указано, какие есть форматы и как они используются при преобразовании:

Элемент форматаПример строки данного форматаОписание
999Каждая цифра 9 представляет значащую цифру результата. Число значащих цифр возвращаемого значения равно числу цифр 9, отрицательное значение предваряется знаком минуса. Все начальные нули заменяются пробелами.
00999Возвращается число с начальными нулями, а не пробелами.
09990Возвращается число с конечными нулями, а не пробелами.
$$999Возвращаемое значение предваряется знаком доллара не зависимо от используемого символа денежной единицы можно применить совместно с начальными или конечными нулями.
BB999Вместо нулевой целой части десятичного число возвращаются пробелы.
MI999MIВозвращает отрицательное число, у которого знак минуса указан не в начале, а в конце. В положительном значении на этом месте будет пробел.
SS9999Возвращаемое число предваряется знаком: + для положительных, чисел - для отрицательных.
S9999SВозвращаемое число заканчивается знаком: + для положительных, чисел - для отрицательных.
PR99PRВозвращается отрицательное число в угловых скобках "<", ">". У положительных чисел, на этом месте пробелы.
D99D9Возвращает число с десятичной точкой в указанной позиции. Число 9 с обеих сторон указывает максимальное число цифр.
G9G999Возвращает число с разделителем групп в указанной позиции. G может появляться в указанной строке формата неоднократно.
CC99Возвращает число с символом денежной единицы ISO в указанной позиции. C может появляться в указанной строке формата неоднократно.
LL999Возвращает число с символом денежной единицы национального языка в указанной позиции.
,999,999Возвращает число с запятой в указанной позиции, не зависимо от выбранного разделителя групп.
.99.99Возвращает число с десятичной точкой в указанной позиции, не зависимо от выбранного десятичного разделителя.
V99V999Возвращает число, умноженное на 10n, где n - это число цифр 9 после V. При необходимости значение округляется.
EEEE9.99EEEEВозвращает число в экспоненциальном представлении.
RMRMВозвращает число при помощи римских цифр верхнего регистра.

Для примера, приведем вот такой блок:

SET SERVEROUTPUT ON

BEGIN

	-- Function  TO_CHAR() --
	DBMS_OUTPUT.put_line( TO_CHAR(534523));

	-- Function  TO_CHAR() --
	DBMS_OUTPUT.put_line( TO_CHAR(34387,  '99999'));

	-- Function  TO_CHAR() --
	DBMS_OUTPUT.put_line( TO_CHAR(5000,  '$9999'));

	-- Function  TO_CHAR() --
	DBMS_OUTPUT.put_line( TO_CHAR(-9,  '9S'));

	-- Function  TO_CHAR() --
	DBMS_OUTPUT.put_line( TO_CHAR(-34,  'S99'));

	-- Function  TO_CHAR() --
	DBMS_OUTPUT.put_line( TO_CHAR(3 - 5,  '999MI'));

	-- Function  TO_CHAR() --
	DBMS_OUTPUT.put_line( TO_CHAR(7 - 3,  'S9'));

	-- Function  TO_CHAR() --
	DBMS_OUTPUT.put_line( TO_CHAR(4 - 5,  '99PR'));

	-- Function  TO_CHAR() --
	DBMS_OUTPUT.put_line( TO_CHAR(8900,  'L9999'));

	-- Function  TO_CHAR() --
	DBMS_OUTPUT.put_line( TO_CHAR(10000000,  '9.9EEEE'));

	-- Function  TO_CHAR() --
	DBMS_OUTPUT.put_line( TO_CHAR(10,  'RM'));

	-- Function  TO_CHAR() --
	DBMS_OUTPUT.put_line( TO_CHAR(105,  'RM'));

END;
/

После запуска получаем:

SQL> BEGIN
  2  
  3  	-- Function  TO_CHAR() --
  4  	DBMS_OUTPUT.put_line( TO_CHAR(534523));
  5  
  6  	-- Function  TO_CHAR() --
  7  	DBMS_OUTPUT.put_line( TO_CHAR(34387,  '99999'));
  8  
  9  	-- Function  TO_CHAR() --
 10  	DBMS_OUTPUT.put_line( TO_CHAR(5000,  '$9999'));
 11  
 12  	-- Function  TO_CHAR() --
 13  	DBMS_OUTPUT.put_line( TO_CHAR(-9,  '9S'));
 14  
 15  	-- Function  TO_CHAR() --
 16  	DBMS_OUTPUT.put_line( TO_CHAR(-34,  'S99'));
 17  
 18  	-- Function  TO_CHAR() --
 19  	DBMS_OUTPUT.put_line( TO_CHAR(3 - 5,  '999MI'));
 20  
 21  	-- Function  TO_CHAR() --
 22  	DBMS_OUTPUT.put_line( TO_CHAR(7 - 3,  'S9'));
 23  
 24  	-- Function  TO_CHAR() --
 25  	DBMS_OUTPUT.put_line( TO_CHAR(4 - 5,  '99PR'));
 26  
 27  	-- Function  TO_CHAR() --
 28  	DBMS_OUTPUT.put_line( TO_CHAR(8900,  'L9999'));
 29  
 30  	-- Function  TO_CHAR() --
 31  	DBMS_OUTPUT.put_line( TO_CHAR(10000000,  '9.9EEEE'));
 32  
 33  	-- Function  TO_CHAR() --
 34  	DBMS_OUTPUT.put_line( TO_CHAR(10,  'RM'));
 35  
 36  	-- Function  TO_CHAR() --
 37  	DBMS_OUTPUT.put_line( TO_CHAR(105,  'RM'));
 38  
 39  END;
 40  /
534523                                                                          
34387                                                                           
$5000                                                                           
9-                                                                              
-34                                                                             
2-                                                                              
+4                                                                              
<1>                                                                             
р.8900                                                                          
1.0E+07                                                                         
X                                                                               
CV                                                                              

Процедура PL/SQL успешно завершена.

И для полноты картины, давайте рассмотрим функцию TO_NUMBER(), так как с TO_CHAR() они практически близнецы, но с двух противоположных сторон. Синтаксис у TO_NUMBER следующий:

TO_NUMBER(строка_символов, [, формат [, nls_параметр]])

В данном случае "строка_символов" - это тип CHAR или VARCHAR2, которая применительно к "формат", преобразуется в типу NUMBER. "формат" в данной функции, тот же что и для TO_CHAR(). Вот так достаточно просто. А, если в предыдущем примере поменять, например, третью снизу строку вот так:

DBMS_OUTPUT.put_line( TO_CHAR(TO_NUMBER('10000000',  '9.9EEEE'), '9.9EEEE') );

То, достаточно хорошо видно, как все взаимосвязано для этих двух функций! Пробуйте!!! :)


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Летучий Сергей - 16.11.2003