当前所在位置:珠峰网资料 >> 计算机 >> Oracle认证 >> 正文
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
广告合作:400-664-0084 全国热线:400-664-0084
Copyright 2010 - 2017 www.my8848.com 珠峰网 粤ICP备15066211号
珠峰网 版权所有 All Rights Reserved