Oracle认证考试辅导:Oracle11新特性虚拟列
发布时间:2010/3/15 16:21:06 来源:城市学习网 编辑:MOON
对于虚拟列又有一点新的研究。
虽然虚拟列不能参考其他的虚拟列,但是可以通过其他的方法来变相实现:
SQLCREATETABLET_V_COL_P
2(
3IDNUMBERPRIMARYKEY,
4NAMEVARCHAR2(30),
5V_NAMEAS(LOWER(NAME)),
6V_COLAS(LENGTH(V_NAME))
7);
V_NAMEAS(LOWER(NAME)),
*第5行出现错误:
ORA-54012:在列表达式中引用了虚拟列
由于虚拟列并不存储数据,而且数据的生成是在查询的时候,因此可以先建立表,然后将表的主键作为参数传递给虚拟列参考的函数:
SQLCREATEORREPLACEFUNCTIONF_TEST_VIRTUAL(P_INNUMBER)RETURNNUMBERDETERMINISTICAS
2BEGIN
3FORIIN(SELECTLENGTH(V_NAME)LENFROMT_V_COL_PWHEREID=P_IN)LOOP
4RETURNI.LEN;
5ENDLOOP;
6END;
7/
函数已创建。
SQLINSERTINTOT_V_COL_P(ID,NAME)VALUES(1,’TABLE’);
已创建1行。
SQLINSERTINTOT_V_COL_P(ID,NAME)VALUES(2,’INDEX’);
已创建1行。
SQLSELECT*FROMT_V_COL_P;
IDNAMEV_NAMEV_COL
1TABLEtable5
2INDEXindex5
通过这个变相的方法,就可以实现虚拟列参考其他的虚拟列。当前,由于虚拟列的数值本身就来自其他的实际列,因此虚拟列参考虚拟列的意义不大。
但是上面给出的方法还是很有意义的,可以利用这个方法实现很多的功能。
举个简单的例子,刚才建立的是主表,有一个子表引用主表:
SQLCREATETABLET_V_COL_F
2(
3IDNUMBER,
4FIDNUMBER,
5NAMEVARCHAR2(30),
6FOREIGNKEY(FID)REFERENCEST_V_COL_P
7);
表已创建。
SQLINSERTINTOT_V_COL_FSELECT100000+ROWNUM,1,TABLE_NAMEFROMDBA_TABLES;
已创建2493行。
SQLINSERTINTOT_V_COL_FSELECT200000+ROWNUM,2,INDEX_NAMEFROMDBA_INDEXES;
已创建3945行。
如果想查询主表记录的同时查询参考当前主表ID的子表记录数:
SQLSELECTID,NAME,V_NAME,(SELECTCOUNT(*)FROMT_V_COL_FWHEREFID=A.ID)NUM
2FROMT_V_COL_PA;
IDNAMEV_NAMENUM
1TABLEtable2493
2INDEXindex3945
这是常规的写法,而使用虚拟列可以在一张表上实现这个功能:
SQLCREATEORREPLACEFUNCTIONF_TEST_VIRTUAL(P_INNUMBER)RETURNNUMBERDETERMINISTICAS
2BEGIN
3FORIIN(SELECTCOUNT(*)NUMFROMT_V_COL_FWHEREFID=P_IN)LOOP
4RETURNI.NUM;
5ENDLOOP;
6END;
7/
函数已创建。
SQLSELECT*FROMT_V_COL_P;
IDNAMEV_NAMEV_COL
1TABLEtable2493
2INDEXindex3945
采用这种方法可以简化很多的问题,而且如果不访问虚拟列,并不会引发对子表的访问。
这种方法唯一需要注意一点,不要造成循环引用:
SQLCREATEORREPLACEFUNCTIONF_TEST_VIRTUAL(P_INNUMBER)RETURNNUMBERDETERMINISTICAS
2BEGIN
3FORIIN(SELECTV_COLFROMT_V_COL_PWHEREID=P_IN)LOOP
4RETURNI.V_COL;
5ENDLOOP;
6END;
7/
函数已创建。
SQLSELECT*FROMT_V_COL_P;
SELECT*FROMT_V_COL_P
*第1行出现错误:
ORA-00036:超过递归SQL级别的最大值50
ORA-06512:在"YANGTK.F_TEST_VIRTUAL",line3
ORA-06512:在"YANGTK.F_TEST_VIRTUAL",line3
ORA-06512:在"YANGTK.F_TEST_VIRTUAL",line3
ORA-06512:在"YANGTK.F_TEST_VIRTUAL",line3
ORA-06512:在"YANGTK.F_TEST_VIRTUAL",line3
ORA-06512:在"YANGTK.F_TEST_VIRTUAL",line3
ORA-06512:在"YANGTK.F_TEST_VIRTUAL",line3
ORA-06512:在"YANGTK.F_TEST_VIRTUAL",line3
ORA-06512:在"YANGTK.F_TEST_VIRTUAL",line3
ORA-06512:在"YANGTK.F_TEST_VIRTUAL",line3
ORA-06512:在"YANGTK.F_TEST_VIRTUAL",line3
ORA-06512:在"YANGTK.F_TEST_VIRTUAL",line3
ORA-06512:在"YANGTK.F_TEST_VIRTUAL",line3
ORA-06512:在"YANGTK.F_TEST_VIRTUAL",line3
ORA-06512:在"YANGTK.F_TEST_VIRTUAL",line3
ORA-06512:在"YANGTK.F_TEST_VIRTUAL",line3
ORA-06512:在"YANGTK.F_TEST_VIRTUAL",line3
ORA-06512:在"YANGTK.F_TEST_VIRTUAL",line3
ORA-06512:在"YANGTK.F_TEST_VIRTUAL",line3
ORA-06512:在"YANGTK.F_TEST_VIRTUAL",line3
ORA-06512:在"YANGTK.F_TEST_VIRTUAL",line3
ORA-06512:在"YANGTK.F_TEST_VIRTUAL",line3
ORA-06512:在"YANGTK.F_TEST_VIRTUAL",line3
ORA-06512:在"YANGTK.F_TEST_VIRTUAL",line3
ORA-06512:在"YANGTK.F_TEST_VIRTUAL",line3
ORA-06512:在"YANGTK.F_TEST_VIRTUAL",line3
ORA-06512:在"YANGTK.F_TEST_VIRTUAL",line3
ORA-06512:在"YANGTK.F_TEST_VIRTUAL",line3
ORA-06512:在"YANGTK.F_TEST_VIRTUAL",line3
ORA-06512:在"YANGTK.F_TEST_VIRTUAL",line3
ORA-06512:在"YANGTK.F_TEST_VIRTUAL",line3
ORA-06512:在"YANGTK.F_TEST_VIRTUAL",line3
ORA-06512:在"YANGTK.F_TEST_VIRTUAL",line3
ORA-06512:在"YANGTK.F_TEST_VIRTUAL",line3
ORA-06512:在"YANGTK.F_TEST_VIRTUAL",line3
ORA-06512:在"YANGTK.F_TEST_VIRTUAL",line3
ORA-06512:在"YANGTK.F_TEST_VIRTUAL",line3
ORA-06512:在"YANGTK.F_TEST_VIRTUAL",line3
ORA-06512:在"YANGTK.F_TEST_VIRTUAL",line3