2

在 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 上的另一个环境中完美运行。

4

1 回答 1

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
于 2016-02-17T12:53:42.007 回答