Точность числа 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) звучит как ошибка.

Другие вопросы по тегам