Точность числа Oracle и масштабирование равны нулю, если в предложении select используется регистр
Учитывая эту таблицу,
CREATE TABLE test (
c01 INT,
c02 NUMBER(10,5),
c03 NUMBER(18,10)
);
Я использую OCCI (библиотека C++) для выполнения следующего запроса SELECT:
select case(c01) when 10 then c02 else c03 end from test;
В этом случае, Typecode я получаю это OCCI_SQLT_NUM
но точность и масштаб оба 0
, Что это (0
точность и масштаб) значит? Это ошибка?
Не зная точности / масштаба, на карту поставлены безопасность типов, семантика и правильность программы, так как невозможно решить, следует ли рассматривать ее как целое число или число с плавающей запятой.
Другими словами, каков тип CASE(x) WHEN y THEN a ELSE b
выражение? Можно a
быть INT
а также b
быть CHAR[32]
? Я думаю нет. Так как же вычисляется тип?
1 ответ
В CASE
выражение, типы данных выражений в THEN
а также ELSE
пункты должны быть совместимы. Так что вы не можете иметь NUMBER
в THEN
пункт, а затем DATE
или же VARCHAR2
в ELSE
пункт.
Однако точность и масштаб не являются частью типа данных. Точность и масштаб лучше рассматривать как ограничения на значения, допустимые в таблице. NUMBER(10,2)
тот же тип данных, что и NUMBER
, но с ограничением, что должно быть не более десяти общих цифр, включая две, зарезервированные для десятичной части, и не более двух после десятичной точки. (Затем вставив 5.333
все равно будет работать - но только потому, что Oracle автоматически и без предупреждения округляет это число, чтобы поместиться в столбец... но если вы дали ему вход 123456123456
, нет "скругления", которое сделает его подходящим, поэтому вставка не удастся). Тип данных вашего CASE
выражение просто NUMBER
, (Кстати, в Oracle SQL даже INT
ограничение - Oracle НЕ ДЕЛАЕТ целочисленную арифметику!!)
NUMBER(0,0)
не существует в Oracle; если вы попытаетесь CREATE TABLE test (col NUMBER(0,0))
, это не удастся. Сообщение об ошибке скажет вам, что точность (первое число) должна быть между 1 и 38. Таким образом, независимо от того, что произведено NUMBER(0,0)
звучит как ошибка.