2016-02-17 4 views
2

В одном из окружающей среды на 11G, я создал таблицу с одной виртуальной колонкой следующим образомOracle, виртуальная колонка генерирует -1,0002 ... вместо -1 на одном примере

create table TEST_VIRTUAL_COL(
    col1 number(5), 
    col2 varchar2(10), 
    col3 number generated always as((-1)) virtual visible 
); 

Затем вставить строку в этом

insert into TEST_VIRTUAL_COL (col1,col2) values (1,'Test'); 

Когда я выбираю данные из этой таблицы

select * from TEST_VIRTUAL_COL; 

я получаю следующий вывод

COL1 | COL2 | COL3 
--------------------------------------------------------- 
    1 | Test | -1.00020202020065020202005723022430686716 

COL3 не показывает -1

Любая идея вокруг этого, как получить -1 как выход COL3?

Он отлично работает в другой среде на Oracle 11g.

+1

Вы с помощью тот же клиент для подключения к обоим экземплярам? Или вы используете разных клиентов? Можете ли вы рассказать нам больше о своей клиентской и серверной среде (ОС, точный номер версии вашей базы данных Oracle ...)? –

+1

Не знаете, как ошибка 9039716 влияет на числа, но может быть правдоподобной, если сломанная среда находится в уязвимой версии. Вы всегда получаете такое же значение? И что показывает 'dump()' для этого столбца? –

ответ

3

Я мог бы реплицировать вашу проблему на моем тестовом компьютере, который работает Oracle 11.2.0.1.0 - 64bit на Windows.

Поначалу кажется, что обработка литерала -1 рассматривается как значение с плавающей запятой, а не как число.

CREATE TABLE TEST_VIRTUAL_COL (
    col1 NUMBER(5), 
    col2 VARCHAR2(10), 
    col3 NUMBER GENERATED ALWAYS AS (-1) VIRTUAL VISIBLE 
); 
INSERT INTO TEST_VIRTUAL_COL (col1, col2) VALUES (1, 'Test'); 
SELECT col3, DUMP(col3) FROM TEST_VIRTUAL_COL; 

дает выход:

COL3  | DUMP(COL3) 
----------------------------------------------------------------------------------------- 
-1.00020202 | Typ=2 Len=22: 62,100,102,0,0,0,0,0,161,0,0,0,0,143,179,0,168,85,254,28,0,0 

Явное литья буквальным ряда решить вопрос:

CREATE TABLE TEST_VIRTUAL_COL (
    col1 NUMBER(5), 
    col2 VARCHAR2(10), 
    col3 NUMBER GENERATED ALWAYS AS (CAST(-1 AS NUMBER)) VIRTUAL VISIBLE 
); 
INSERT INTO TEST_VIRTUAL_COL (col1, col2) VALUES (1, 'Test'); 
SELECT col3, DUMP(col3) FROM TEST_VIRTUAL_COL; 

дает выход:

COL3 | DUMP(COL3) 
------------------------------- 
-1 | Typ=2 Len=3: 62,100,102 
Смежные вопросы