Oracle 11G虚拟列Virtual Column介绍
Oracle 11G虚拟列Virtual Column介绍[html]Oracle 11G 虚拟列 Virtual ColumnOracle 11G 在表中引入了虚拟列,虚拟列是一个表达式,在运行时计算,不存储在数据库中,不能更新虚拟列的值。定义一个虚拟列的语法:column_name [datatype] [GENERATED ALWAYS] AS [expression] [VIRTUAL]1.虚拟列可以用在select,update,delete语句的where条件中,但是不能用于DML语句2.可以基于虚拟列来做分区3. 可以在虚拟列上建索引,oracle的函数索引就类似。4. 可以在虚拟列上建约束创建一个带虚拟列的表:CREATE TABLE EMPLOYEE(empl_id NUMBER,empl_nm VARCHAR2(50),monthly_sal NUMBER(10,2),bonus NUMBER(10,2),total_sal NUMBER(10,2) GENERATED ALWAYS AS (monthly_sal*12 + bonus));total_sal就是一个虚拟列查看下表定义内容:SELECT column_name, data_type, data_length, data_default, virtual_columnFROM user_tab_colsWHERE table_name = 'EMPLOYEE';COLUMN_NAME | DATA_TYPE | DATA_LENGTH | DATA_DEFAULT | VIRTUAL_COLUMNEMPL_ID | NUMBER | 22 | null | NOEMPL_NM | VARCHAR2 | 50 | null | NOMONTHLY_SAL | NUMBER | 22 | null | NOBONUS | NUMBER | 22 | null | NOTOTAL_SAL | NUMBER | 22 | "MONTHLY_SAL"*12+"BONUS" | YESvirtual_column是yes,表示是虚拟列,我们也可以在建表语句加上VIRTUAL,显示声明为虚拟列DROP TABLE EMPLOYEE PURGE;CREATE OR REPLACE FUNCTION get_empl_total_sal ( p_monthly_sal NUMBER,p_bonus NUMBER)RETURN NUMBERDETERMINISTICISBEGINRETURN p_monthly_sal * 12 + p_bonus;END;CREATE TABLE EMPLOYEE(empl_id NUMBER,empl_nm VARCHAR2(50),monthly_sal NUMBER(10,2),bonus NUMBER(10,2),total_sal NUMBER(10,2) AS (get_empl_total_sal(monthly_sal, bonus)) VIRTUAL);我们可以在虚拟列上创建索引CREATE INDEX idx_total_sal ON employee(total_sal);SELECT index_name, index_typeFROM user_indexesWHERE table_name = 'EMPLOYEE';INDEX_NAME INDEX_TYPEIDX_TOTAL_SAL FUNCTION-BASED NORMAL这个函数也是表定义内容DROP FUNCTION get_empl_total_sal;SELECT * FROM employee;*Error at line 0ORA-00904: "schema"."GET_EMPL_TOTAL_SAL": invalid identifier可以添加一个虚拟列DROP TABLE EMPLOYEE PURGE;CREATE TABLE EMPLOYEE(empl_id NUMBER,empl_nm VARCHAR2(50),monthly_sal NUMBER(10,2),bonus NUMBER(10,2));ALTER TABLE EMPLOYEE ADD (total_sal AS (monthly_sal * 12 + bonus));这个新列的类型时不确定的,是根据表达式来推断的。INSERT INTO employee (empl_id, empl_nm, monthly_sal, bonus)WITH DATA AS(SELECT 100 empl_id, 'AAA' empl_nm, 20000 monthly_sal, 3000 bonusFROM DUALUNIONSELECT 200, 'BBB', 12000, 2000FROM DUALUNIONSELECT 300, 'CCC', 32100, 1000FROM DUALUNIONSELECT 400, 'DDD', 24300, 5000FROM DUALUNIONSELECT 500, 'EEE', 12300, 8000FROM DUAL)&n上一个:磁盘管理之查看磁盘信息
下一个:Oracle删除重复记录的几种方式
- 更多Oracle疑问解答:
- 运行exp备份oracle数据库提示oracle-12154错误
- 有没有,生产Oracle Rman 备份脚本的工具啊!
- 初学orcle,希望有大大帮忙解说一下详细步骤,从登录oracle到创建表的过程
- oracle语句问题:一张user表,三个字段,id,name,time,插入记录比如:张三2007,李四2008,张三2011
- 如何写一个ORACLE触发器同步两个表中的数据?
- oracle 如何查看一个服务器上有多少个数据库.
- oracle 创建包的时候错误 求解
- oracle 重复列的问题
- oracle 中如何查处2星期前的数据
- 请教oracle数据库安装中的问题
- 请问谁能提供给我标准的oracle ERP的数据库表结构并详细说明各表主要的作用?
- 安装oracle遇到的问题 invalid entry CRC (expected 0x3e12e795 but got 0x9db0e9fd)
- 我的是ORACLE 10G,在RMAN中如何按指定的时间恢复数据文件啊?
- oracle为什么没有自动增长列
- oracle快捷键都有哪些啊?