PL/SQL реализует несколько операторов, используемых при работе с числами. Эти операторы перечислены в табл. 1 в порядке возрастания приоритетов. Операторы с более низким приоритетом выполняются до операторов с более высоким приоритетом.
Числовые операторы
Оператор | Операция | Приоритет |
** | Возведение в степень | 1 |
+ | Тождество | 2 |
- | Отрицание | 2 |
* | Умножение | 3 |
/ | Деление | 3 |
+ | Сложение | 4 |
– | Вычитание | 4 |
= | Равно | 5 |
< | Меньше чем | 5 |
> | Больше чем | 5 |
<= | Меньше либо равно | 5 |
>= | Больше либо равно | 5 |
<>, !=, ~=, ^= | Не равно | 5 |
IS NULL | Проверка неопределенности | 5 |
BETWEEN | Принадлежность диапазону | 5 |
NOT | Логическое отрицание | 6 |
AND | Конъюнкция | 7 |
OR | Дизъюнкция | 8 |
Числовые функции
В PL/SQL реализовано множество функций для работы с числами. Мы уже рассматривали функции преобразования TO_CHAR
, TO_NUMBER, TO_BINARY_FLOAT
и TO_BINARY_DOUBLE
. В нескольких ближайших разделах приведены краткие описания важнейших функций. За подробными описаниями конкретных функций обращайтесь к справочнику Oracle SQL Reference.
Функции округления и усечения
Существуют четыре числовые функции, выполняющие округление и усечение числовых значений: CEIL, FLOOR, ROUND
и TRUNC
. Выбор нужной функции для конкретной ситуации может вызвать затруднения, поэтому в табл. 1 приводятся их сравнительные описания, а на рис. 5 представлены результаты вызова всех четырех функций с разными значениями.
Функция | Описание |
CEIL | Возвращает наименьшее целое число, большее либо равное заданному значению |
FLOOR | Возвращает наибольшее целое число, меньшее либо равное заданному значению |
ROUND | Выполняет округление числа. Положительное значение параметра определяет способ округления цифр, находящихся справа от запятой, а отрицательное — находящихся слева |
TRUNC | Усекает число до заданного количества десятичных знаков, отбрасывая все цифры, находящиеся справа |
Рис. 1. Функции округления и усечения
Тригонометрические функции
В PL/SQL поддерживаются все основные тригонометрические функции. При их использовании следует помнить, что углы задаются в радианах, а не в градусах. Преобразование радианов в градусы и наоборот выполняется по следующим формулам:
radians = pi * degrees / 180 -- Градусы в радианы degrees = radians * 180 / pi -- Радианы в градусы
В PL/SQL нет отдельной функции для получения числа π, однако его можно получить косвенным методом:
ACOS (-1)
Арккосинус числа –1 равен значению π. Конечно, поскольку это число представляет собой бесконечную десятичную дробь, вы всегда будете работать с его приближенным значением. Для получения нужной точности можно округлить результат вызова ACOS
(-1) до нужного количества позиций функцией ROUND
.
Сводка числовых функций PL/SQL
В этом разделе представлены краткие описания всех встроенных функций PL/SQL. Там, где это возможно, функции перегружаются для разных числовых типов. Например:
ABS
Функция перегружена для типовBINARY_DOUBLE, BINARY_FLOAT, NUMBER, SIMPLE_INTEGER, SIMPLE_FLOAT, SIMPLE_DOUBLE
иPLS_INTEGER
, так как операция определения абсолютного значения применима как к вещественным, так и к целочисленным значениям.BITAND
Функция перегружена для типовPLS_INTEGER
иINTEGER
(подтипNUMBER
), так как операцияAND
может применяться только к целочисленным значениям.CEIL
Функция перегружена для типовBINARY_DOUBLE, BINARY_FLOAT
иNUMBER
, поскольку функцияCEIL
не актуальна для целых чисел.
Чтобы узнать, для каких типов перегружена та или иная функция, запросите описание встроенного пакета SYS.STANDARD
:
SQL> DESCRIBE SYS.STANDARD FUNCTION CEIL RETURNS NUMBER Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- N NUMBER IN FUNCTION CEIL RETURNS BINARY_FLOAT Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- F BINARY_FLOAT IN FUNCTION CEIL RETURNS BINARY_DOUBLE Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- D BINARY_DOUBLE IN ...
Почти все функции в следующем списке определяются во встроенном пакете SYS
. STANDARD
. Единственным исключением является функция BIN_TO_NUM
. За полной документацией по отдельным функциям обращайтесь к справочнику Oracle SQL Reference.
ABS(n)
Возвращает абсолютное значение числа.
ACOS(n)
Возвращает арккосинус угла n из диапазона [–1; 1]. Возвращаемое функцией значение находится в пределах от 0 до π.
ASIN(n)
Возвращает арксинус угла n из диапазона [–1; 1]. Возвращаемое функцией значение находится в пределах от −π/2 до −π/2.
ATAN(n)
Возвращает арктангенс угла n из диапазона (–∞
; +∞
). Возвращаемое функцией значение находится в пределах от −π/2 до −π/2.
ATAN2(n, m)
Возвращает арктангенс n/m
для чисел n
и m
из диапазона (–∞
; +∞
). Возвращаемое функцией значение находится в пределах от −π/2 до −π/2.
BIN_TO_NUM(b1, b2,...bn)
Преобразует битовый вектор, представленный значениями от b1 до bn, в число. Каждое из значений вектора должно быть равно либо 0, либо 1. Например, результат вызова BIN_TO_NUM(1,1,0,0)
равен 12.
BITAND(n, m)
Выполняет поразрядную операцию AND
над битами двух положительных целых чисел. Например, вызов BITAND(12,4)
дает результат 4, то есть в значении 12 (двоичное 1100) установлен 4-й бит.
Вам будет проще работать с BITAND
, если вы ограничитесь положительными целыми числами. Значения типа PLS_INTEGER
, особенно удобного в сочетании с BITAND
, позволяют хранить значения до 230; таким образом, в вашем распоряжении 30 битов для выполнения поразрядных операций.
CEIL(n)
Возвращает наименьшее целое число, которое больше либо равно заданному значению. В табл. 1 и рис. 1 функция CEIL
сравнивается с другими числовыми функциями округления и усечения.
COS(n)
Возвращает косинус угла n
, заданного в радианах. Если угол задается в градусах, то значение следует преобразовать в радианы (см. раздел «Тригонометрические функции»).
COSH(n)
Возвращает гиперболический косинус n
. Если n
— вещественное число, а i
— мнимая единица, тогда связь между функциями COS
и COSH
выражается следующей формулой: COS (i * n) = COSH (n)
EXP(n)
Возвращает число e в степени n
, где n
— аргумент функции. Число e (приблизительно равное 2,71828) является основанием натурального логарифма.
FLOOR(n)
Возвращает наибольшее целое число, которое меньше или равно заданному значению. В табл. 1 и рис. 1 функция FLOOR
сравнивается с другими числовыми функциями округления и усечения.
GREATEST(n1, n2,...n3)
Возвращает наибольшее число во входном списке; например, результат вызова GREATEST (1,0, -1, 20)
равен 20.
LEAST(n1, n2,...n3)
Возвращает наименьшее число во входном списке; например, результат вызова LEAST (1, 0, –1, 20)
равен −1.
LN(n)
Возвращает натуральный логарифм числа. Значение аргумента n
должно быть больше 0
или равно ему. Если вызвать LN
с отрицательным аргументом, выводится сообщение об ошибке.
LOG(b, n)
Возвращает логарифм заданного числа по указанному основанию. Значение аргумента n должно быть больше 0 или равно ему, а основание b
должно быть больше 1. Если какой-либо из аргументов LOG
не отвечает этим требованиям, выводится сообщение об ошибке.
MOD(n, m)
Возвращает остаток от деления n
на m
. Остаток вычисляется по формуле, эквивалентной n-(m*FLOOR(n/m))
при совпадении знаков n
и m
или n-(m*CEIL(n/m))
при различающихся знаках. Например, результат вызова MOD(10, 2.8)
равен 1.6. Если аргумент m
равен 0, возвращается значение n
. С помощью функции MOD
можно быстро проверить число на четность или нечетность:
FUNCTION is_odd (num_in IN NUMBER) RETURN BOOLEAN IS BEGIN RETURN MOD (num_in, 2) = 1; END; FUNCTION is_even (num_in IN NUMBER) RETURN BOOLEAN IS BEGIN RETURN MOD (num_in, 2) = 0; END;
NANVL(n, m)
Возвращает m
, если n
является NaN
(«не числом»); в противном случае возвращается n
. Возвращаемое значение относится к числовому типу аргумента, обладающему наибольшим приоритетом в следующем порядке: BINARY_DOUBLE, BINARY_FLOAT
или NUMBER
.
POWER(n, m)
Возводит n
в степень m
. Если значение n
отрицательно, то аргумент m
должен быть целым числом. В следующем примере функция POWER
используется для вычисления диапазона допустимых значений переменной типа PLS_INTEGER (от −231 −1 до 231 −1)
:
POWER (-2, 31) - 1 .. POWER (2, 31) - 1
Результат:
-2147483648 .. 2147483647
REMAINDER(n, m)
Возвращает «псевдоостаток» от деления n на m. Значение вычисляется по следующей формуле:
n - (m*ROUND(n/m))
Например, результат вызова REMAINDER(10, 2.8)
равен −1.2. Сравните с функцией MOD
.
ROUND(n)
Возвращает значение n
, округленное до ближайшего целого. Пример:
ROUND (153.46) --> 153
ROUND(n, m)
Возвращает значение n
, округленное до m
разрядов. Значение m
может быть отрицательным: в этом случае функция ROUND
отсчитывает позиции округления влево, а не вправо от десятичной запятой. Примеры:
ROUND (153.46, 1) --> 153.5 ROUND (153, -1) --> 150
В табл. 1 и рис. 1 функция ROUND
сравнивается с другими числовыми функциями округления и усечения.
SIGN(n)
Возвращает −1, 0 или +1, если значение n меньше нуля, равно нулю или больше нуля соответственно.
SIN(n)
Возвращает синус угла n
, заданного в радианах. Если угол задается в градусах, значение следует преобразовать в радианы (см. раздел «Тригонометрические функции»).
SINH(n)
Возвращает гиперболический синус n
. Если n
— вещественное число, а i
— мнимая единица, тогда связь между функциями SIN
и SINH
выражается следующей формулой:
SIN (i * n) = i * SINH (n) SQRT(n)
Возвращает квадратный корень числа n
, которое должно быть больше либо равно 0
. При отрицательном значении n
выводится сообщение об ошибке.
TAN(n)
Возвращает тангенс угла n
, заданного в радианах. Если угол задается в градусах, значение следует преобразовать в радианы (см. раздел «Тригонометрические функции»).
TANH(n)
Возвращает гиперболический тангенс n
. Если n
— вещественное число, а i
— мнимая единица, тогда связь между функциями TAN
и TANH
выражается следующей формулой:
TAN (i * n) = i * TANH (n)
TRUNC(n)
Усекает значение n
до целого числа. Например, результат вызова TRUNC(10.51)
равен 10.
TRUNC(n, m)
Усекает значение n
до m
разрядов. Например, результат вызова TRUNC(10.789, 2)
равен 10.78. Значение m
может быть отрицательным: в этом случае функция TRUNC
отсчитывает позиции усечения влево, а не вправо от десятичной запятой. Так, вызов TRUNC(1264, -2)
дает значение 1200.
В табл. 1 и рис. 1 функция CEIL
сравнивается с другими числовыми функциями округления и усечения.