Теперь давайте рассмотрим особенности работы с функцией TO_CHAR() применительно к преобразованию, чисел. При выполнении этой операции функция имеет следующий синтаксис:
TO_CHAR(число, [, формат[, nls_параметр]])
При этом функция TO_CHAR() преобразует тип NUMBER в тип VARCHAR2. В таблице указано, какие есть форматы и как они используются при преобразовании:
Элемент формата | Пример строки данного формата | Описание |
---|---|---|
9 | 99 | Каждая цифра 9 представляет значащую цифру результата. Число значащих цифр возвращаемого значения равно числу цифр 9, отрицательное значение предваряется знаком минуса. Все начальные нули заменяются пробелами. |
0 | 0999 | Возвращается число с начальными нулями, а не пробелами. |
0 | 9990 | Возвращается число с конечными нулями, а не пробелами. |
$ | $999 | Возвращаемое значение предваряется знаком доллара не зависимо от используемого символа денежной единицы можно применить совместно с начальными или конечными нулями. |
B | B999 | Вместо нулевой целой части десятичного число возвращаются пробелы. |
MI | 999MI | Возвращает отрицательное число, у которого знак минуса указан не в начале, а в конце. В положительном значении на этом месте будет пробел. |
S | S9999 | Возвращаемое число предваряется знаком: + для положительных, чисел - для отрицательных. |
S | 9999S | Возвращаемое число заканчивается знаком: + для положительных, чисел - для отрицательных. |
PR | 99PR | Возвращается отрицательное число в угловых скобках "<", ">". У положительных чисел, на этом месте пробелы. |
D | 99D9 | Возвращает число с десятичной точкой в указанной позиции. Число 9 с обеих сторон указывает максимальное число цифр. |
G | 9G999 | Возвращает число с разделителем групп в указанной позиции. G может появляться в указанной строке формата неоднократно. |
C | C99 | Возвращает число с символом денежной единицы ISO в указанной позиции. C может появляться в указанной строке формата неоднократно. |
L | L999 | Возвращает число с символом денежной единицы национального языка в указанной позиции. |
, | 999,999 | Возвращает число с запятой в указанной позиции, не зависимо от выбранного разделителя групп. |
. | 99.99 | Возвращает число с десятичной точкой в указанной позиции, не зависимо от выбранного десятичного разделителя. |
V | 99V999 | Возвращает число, умноженное на 10n, где n - это число цифр 9 после V. При необходимости значение округляется. |
EEEE | 9.99EEEE | Возвращает число в экспоненциальном представлении. |
RM | RM | Возвращает число при помощи римских цифр верхнего регистра. |
Для примера, приведем вот такой блок:
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') );
То, достаточно хорошо видно, как все взаимосвязано для этих двух функций! Пробуйте!!! :)