搬磚頭

          Knocking on Heaven's Door
          posts - 34, comments - 6, trackbacks - 0, articles - 0

          oracle視圖

          Posted on 2007-10-09 10:05 生活在別處 閱讀(712) 評論(0)  編輯  收藏 所屬分類: Oracle

           

          Oracle的數據庫對象分為五種:表,視圖,序列,索引和同義詞。

               視圖是基于一個表或多個表或視圖的邏輯表,本身不包含數據,通過它可以對表里面的數據進行查詢和修改。視圖基于的表稱為基表。

               視圖是存儲在數據字典里的一條select語句。 通過創建視圖可以提取數據的邏輯上的集合或組合。

          視圖的優點:

                 1.對數據庫的訪問,因為視圖可以有選擇性的選取數據庫里的一部分。

                 2.用戶通過簡單的查詢可以從復雜查詢中得到結果。

                 3.維護數據的獨立性,試圖可從多個表檢索數據。

                 4.對于相同的數據可產生不同的視圖。

          視圖分為簡單視圖和復雜視圖:

                 簡單視圖只從單表里獲取數據
                 復雜視圖從多表

                 簡單視圖不包含函數和數據組
                 復雜視圖包含

                簡單視圖可以實現DML操作
                復雜視圖不可以.

          視圖的創建:

              CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view_name

            [(alias[, alias]...)]

             AS subquery
             [WITH CHECK OPTION [CONSTRAINT constraint]]
             [WITH READ ONLY]
          FORCE               :不管基表是否存在ORACLE都會自動創建該視圖;
          NOFORCE          :只有基表都存在ORACLE才會創建該視圖:
          alias                    :為視圖產生的列定義的別名;
          subquery            :一條完整的SELECT語句,可以在該語句中定義別名;
          WITH CHECK   OPTION :
                                       插入或修改的數據行必須滿足視圖定義的約束;
          WITH READ ONLY :
                                      該視圖上不能進行任何DML操作。
          例如:
                  CREATE   OR   REPLACE   VIEW   dept_sum_vw
                          (name,minsal,maxsal,avgsal)
                  AS   SELECT d.dname,min(e.sal),max(e.sal),avg(e.sal)
                  FROM     emp e,dept d
                  WHERE   e.deptno=d.deptno
                  GROUP   BY   d.dname;
          視圖的定義原則:
                  1.視圖的查詢可以使用復雜的SELECT語法,包括連接/分組查詢和子查詢;
                  2.在沒有WITH CHECK OPTION和 READ ONLY 的情況下,查詢中不能使用
                     ORDER BY 子句;
                  3.如果沒有為CHECK OPTION約束命名,系統會自動為之命名,形式為SYS_Cn;
                  4.OR REPLACE選項可以不刪除原視圖便可更改其定義并重建,或重新授予對象
                     權限。
          視圖的查詢:
                     視圖創建成功后,可以從視圖中檢索數據,這點和從表中檢索數據一樣。
                     還可以查詢視圖的全部信息和指定的數據行和列。
              如:
                    檢索數據:
                     SQL>SELECT * FROM   dept_sum_vw;
                    查詢視圖定義:
                    SELECT view_name,text   from user_views;
                       其中text顯示的內容為視圖定義的SELECT語句,可通過DESC USER_VIEWS
                       得到相關信息。
          修改視圖:
                   通過OR REPLACE 重新創建同名視圖即可。
          視圖上的DML 操作:
                   DML操作應遵循的原則:
                   1.簡單視圖可以執行DML操作;
                   2.在視圖包含GROUP 函數,GROUP BY子句,DISTINCT關鍵字時不能
                      刪除數據行;
                   3.在視圖不出現下列情況時可通過視圖修改基表數據或插入數據:
                       a.視圖中包含GROUP 函數,GROUP BY子句,DISTINCT關鍵字;
                       b.使用表達式定義的列;
                       c.ROWNUM偽列。
                       d.基表中未在視圖中選擇的其他列定義為非空且無默認值。
          視圖可用于保持數據庫的完整性,但作用有限。
          通過視圖執行引用完整性約束可在數據庫級執行約束。
          WITH CHECK OPTION 子句限定:
                    通過視圖執行的INSERTS和UPDATES操作不能創建該視圖檢索不到的數據行,
                    因為它會對插入或修改的數據行執行完整性約束和數據有效性檢查。
             例如:
                      CREATE OR REPLACE VIEW   vw_emp20
                      AS   SELECT *   FROM   emp
                      WHERE   deptno=20
                      WITH CHECK OPTION constraint   vw_emp20_ck;
                     視圖 已建立。
                       查詢結果:
                      SELECT empno,ename,job FROM vw_emp20;
                     
                     EMPNO                 ENAME                 JOB
          ---------------------            --------------           -------------
                         7369                  SMITH                 CLERK
                         7566                  JONES                MANAGER
                         7902                  FORD                 ANALYST
                     修改:
                           UPDATE vw_emp20
                           SET         deptno=20
                           WHERE    empno=7902;
                      將產生錯誤:
                          UPDATE vw_emp20
                                         *
                          ERROR 位于第一行:
                          ORA-01402:視圖WITH CHECK OPTION 違反WHERE 子句
          視圖的刪除:
                       DROP VIEW   VIEW_NAME語句刪除視圖。
                       刪除視圖的定義不影響基表中的數據。
                       只有視圖所有者和具備DROP VIEW權限的用戶可以刪除視圖。
                       視圖被刪除后,基于被刪除視圖的其他視圖或應用將無效。
          OR REPLACE     :若所創建的試圖已經存在,ORACLE自動重建該視圖;
          主站蜘蛛池模板: 广平县| 临颍县| 泽库县| 高雄县| 治县。| 潼关县| 湟源县| SHOW| 酒泉市| 永仁县| 双峰县| 新密市| 玉环县| SHOW| 阳西县| 太仆寺旗| 荔波县| 谷城县| 革吉县| 东海县| 景洪市| 齐齐哈尔市| 延庆县| 吉安县| 梓潼县| 吐鲁番市| 大宁县| 沈丘县| 安阳县| 云梦县| 全椒县| 河南省| 柘荣县| 定陶县| 珲春市| 皮山县| 临潭县| 河南省| 文安县| 巴东县| 介休市|