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