Oracle虚拟列在一个实例

时间:2016-02-17 11:21:38

标签: sql oracle generated virtual-column

在11G的一个环境中,我创建了一个包含一个虚拟列的表,如下所示

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 个答案:

答案 0 :(得分:3)

我可以在Windows上运行Oracle 11.2.0.1.0 - 64bit的测试计算机上复制您的问题。

首先猜测,似乎是将文字-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