Maarten wrote a post on Virtual Columns in the oracle database. I read a blogpost on preventing people issuing SELECT * on a table. This was done in a different database, so I decided to try it out in my Oracle Database.
First I create a simple table:
create table demo.emp_nuke ( empno number(4) not null , ename varchar2(10) , sal number(7,2) , deptno number(2) , blowitup number generated always as (1/0) virtual ) /
and I add some data to it:
begin insert into demo.emp_nuke(empno, ename, sal, deptno) values (7499, 'ALLEN', 1600, 30); insert into demo.emp_nuke(empno, ename, sal, deptno) values (7521, 'WARD', 1250, 30); insert into demo.emp_nuke(empno, ename, sal, deptno) values (7654, 'MARTIN', 1250, 30); insert into demo.emp_nuke(empno, ename, sal, deptno) values (7698, 'BLAKE', 2850, 30); insert into demo.emp_nuke(empno, ename, sal, deptno) values (7844, 'TURNER', 1500, 30); insert into demo.emp_nuke(empno, ename, sal, deptno) values (7900, 'JAMES', 950, 30); end; /
Then, when I issue this statement
select * from demo.emp_nuke e /
I get an error:
ORA-01476: divisor is equal to zero
But I can still access the data from the table as long as I don’t include the virtual column:
select e.empno, e.ename, e.sal, e.deptno from demo.emp_nuke e /
EMPNO ENAME SAL DEPTNO ----- ---------- --------- ------ 7499 ALLEN 1600.00 30 7521 WARD 1250.00 30 7654 MARTIN 1250.00 30 7698 BLAKE 2850.00 30 7844 TURNER 1500.00 30 7900 JAMES 950.00 30