2016-12-22 17 views
2

Учитывая эту таблицу,Oracle номер точность и масштаб как нуль, когда случай используется в ЗЕЬЕСТ

CREATE TABLE test (
    c01 INT, 
    c02 NUMBER(10,5), 
    c03 NUMBER(18,10) 
); 

Я использую OCCI (библиотека C++), чтобы выполнить следующий запрос на выборку:

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? Can a be INT и b be CHAR[32]? Я думаю нет. Итак, как вычисляется тип?

+0

[«НОМЕР» и «НОМЕР (*, 0)» то же самое в Oracle?] (Http://stackoverflow.com/questions/28207708/is-number-and-number-0-the-same- в-оракула). Может быть, полезно. – badola

+0

@badola: Нет. Этот случай отличается. – Nawaz

+0

Хм, возможно, он должен представлять 'NUMBER' без масштаба и точности, явно заданных? Попробуйте создать функцию, которая возвращает 'number', вернуть 1, выбрать ее из двойника и посмотреть, получите ли вы тот же тип. Что касается вашего вопроса 'case', см. Http://docs.oracle.com/cd/B19306_01/server.102/b14200/expressions004.htm, в котором говорится, что все' return_expr 'должны иметь одинаковый тип данных или все быть числовыми; в противном случае вы получите ora-00932 (несоответствие типов данных). Также возможно, что 'else NULL' вмешивается в результирующий тип данных case. – Timekiller

ответ

2

В выражении CASE типы данных выражений в статьях THEN и ELSE должны быть совместимы. Поэтому у вас не может быть NUMBER в предложении THEN, а затем DATE или VARCHAR2 в предложении ELSE.

Однако точность и масштаб не являются частью типа данных. Лучше думать о точности и масштабе как ограничений на значениях, допустимых в таблице. NUMBER(10,2) - тот же тип данных, что и NUMBER, но с ограничением на то, что должно быть не более десяти общих цифр, включая два зарезервированных для десятичной части, и не более двух после десятичной точки. (Затем вставка 5.333 будет по-прежнему работать, но только потому, что Oracle будет автоматически и без предупреждения округлять это число, чтобы вписаться в столбец ... но если вы дали ему вход 123456123456, то нет «округления», которое сделает его подходящим, чтобы вставка не будет выполнена). Тип данных вашего выражения CASE - это просто NUMBER. (Кстати, в Oracle SQL, даже INT является ограничение - Oracle НЕ DO целочисленной арифметики !!)

NUMBER(0,0) не существует в Oracle; если вы попробуете CREATE TABLE test (col NUMBER(0,0)), это не удастся. Сообщение об ошибке сообщит вам, что точность (первое число) должна быть между 1 и 38. Таким образом, все, что получилось NUMBER(0,0), звучит как ошибка.

+0

Спасибо за ваш ответ. Я понимаю, что типы в обеих ветвях должны быть совместимы.Однако, когда я использую 'NUMBER (10, 4)' в 'THEN' и' NUMBER (5,2) 'в' ELSE', тогда мой вопрос: какова будет точность/масштаб результата? Oracle, кажется, говорит мне «NUMBER (0,0)», что не имеет смысла. – Nawaz

+1

Я не знаком с «typecode» и всем остальным, о чем вы пишете. Как Oracle говорит вам об этом? Я провел некоторое тестирование (я использовал именно ваш def, добавил некоторые значения и создал новую таблицу "как (выберите CASE_EXPRESSION)" - тип столбца равен NUMBER без точности и масштаба. Если вы проверите 'USER_TAB_COLUMNS', вы увидите, что оба точность и масштаб - это «NULL», а не 0 (число ноль). Возможно, что-то, где-то, меняет «NULL» на «0»? Не Oracle, хотя я не думаю, что это Oracle, который делает это. – mathguy

+0

И снова , результат выражения CASE не имеет предопределенной точности и масштаба! Те, которые имеют смысл только в качестве ограничений, они не являются частью «типа данных». Тип данных - это Oracle NUMBER, который сильно отличается от того, используется в C/C++, это не плавающий или двойной или длинный двойной, это совершенно другой тип данных. – mathguy