天天看點

Oracle學習(10):其他資料庫對象其他資料庫對象

其他資料庫對象

資料庫對象種類

Oracle學習(10):其他資料庫對象其他資料庫對象

視圖

視圖介紹

視圖是一種虛表. 視圖建立在已有表的基礎上, 視圖賴以建立的這些表稱為 基表。 向視圖提供資料内容的語句為SELECT 語句, 可以将視圖了解為 存儲起來的 SELECT 語句. 視圖向使用者提供基表資料的另一種表現形式

視圖的優點

          限制資料通路

          簡化複雜查詢

          提供資料的互相獨立

          同樣的資料,可以有不同的顯示方式

     但視圖不能提高性能

建立視圖語句

使用下面的文法格式建立視圖           •

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

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

          AS subquery

          [WITH CHECK OPTION [CONSTRAINT constraint]]

          [WITH READ ONLY [CONSTRAINT constraint]];

          •FORCE:           子查詢不一定存在           •NOFORCE:     子查詢存在(預設)           •WITH READ ONLY:隻能做查詢操作

子查詢可以是複雜的SELECT 語句

修改視圖語句

使用CREATE OR REPLACEVIEW 子句 修改視圖

          CREATE OR REPLACE VIEW empvu80

           (id_number, name, sal, department_id)

          AS SELECT  employee_id, first_name || ' ' || last_name,

                     salary, department_id

            FROM    employees

            WHERE   department_id = 80;

CREATEVIEW 子句中各列的别名應和子查詢中各列相對應

屏蔽DML操作

可以使用 WITH READ ONLY 選項屏蔽對視圖的DML操作 任何DML 操作都會傳回一個Oracle server 錯誤

删除視圖

删除視圖隻是删除視圖的定義,并不會删除基表的資料

DROP VIEW view;

視圖示例

SQL> --視圖 SQL> create view empincomeview

  2  as

  3  select empno,ename,sal,sal*12 annlsal ,sal*12+nvl(comm,0) income from emp;

SQL> show user

USER 為 "SCOTT"

SQL> /

視圖已建立。

SQL> select * from tab;

TNAME                          TABTYPE  CLUSTERID                                                                                                     

------------------------------ ------- ----------                                                                                                     

DEPT                           TABLE                                                                                                                  

EMP                            TABLE                                                                                                                  

BONUS                          TABLE                                                                                                                  

SALGRADE                       TABLE                                                                                                                  

EMP10                          TABLE                                                                                                                  

EMP20                          TABLE                                                                                                                  

TESTSAVEPOINT                  TABLE                                                                                                                  

TESTDELETE                     TABLE                                                                                                                  

BIN$91xa7gtoQfiGlzbFlex5HQ==$0 TABLE                                                                                                                  

TEST3                          TABLE                                                                                                                  

MYPERSON                       TABLE                                                                                                                  

TNAME                          TABTYPE  CLUSTERID                                                                                                     

------------------------------ ------- ----------                                                                                                     

EMPINCOMEVIEW                  VIEW                                                                                                                   

已選擇12行。

SQL> desc EMPINCOMEVIEW

 名稱                                                                                是否為空? 類型

 ----------------------------------------------------------------------------------- -------- --------------------------------------------------------

 EMPNO                                                                               NOT NULL NUMBER(4)

 ENAME                                                                                        VARCHAR2(10)

 SAL                                                                                          NUMBER(7,2)

 ANNLSAL                                                                                      NUMBER

 INCOME                                                                                       NUMBER

SQL> select * from   名稱                                                                                是否為空

  2   ----------------------------------------------------------------------------------- -------

  3   EMPNO                                                                               NOT NUL

  4   ENAME

  5   SAL

  6   ANNLSAL

  7   INCOME

  8  ;

 EMPNO                                                                               NOT NUL

 *

第 3 行出現錯誤: 

ORA-00933: SQL 指令未正确結束 

SQL> select * from EMPINCOMEVIEW;

     EMPNO ENAME        SAL    ANNLSAL     INCOME                                                                                                     

---------- ---------- ----- ---------- ----------                                                                                                     

      7369 SMITH        800       9600       9600                                                                                                     

      7499 ALLEN       1600      19200      19500                                                                                                     

      7521 WARD        1250      15000      15500                                                                                                     

      7566 JONES       2975      35700      35700                                                                                                     

      7654 MARTIN      1250      15000      16400                                                                                                     

      7698 BLAKE       2850      34200      34200                                                                                                     

      7782 CLARK       2450      29400      29400                                                                                                     

      7788 SCOTT       3000      36000      36000                                                                                                     

      7839 KING        5000      60000      60000                                                                                                     

      7844 TURNER      1500      18000      18000                                                                                                     

      7876 ADAMS       1100      13200      13200                                                                                                     

     EMPNO ENAME        SAL    ANNLSAL     INCOME                                                                                                     

---------- ---------- ----- ---------- ----------                                                                                                     

      7900 JAMES        950      11400      11400                                                                                                     

      7902 FORD        3000      36000      36000                                                                                                     

      7934 MILLER      1300      15600      15600                                                                                                     

已選擇14行。

SQL> host cls

序列

什麼是序列?

序列: 可供多個使用者用來産生唯一數值的資料庫對象

              自動提供唯一的數值               共享對象               主要用于提供主鍵值               将序列值裝入記憶體可以提高通路效率

定義序列語句

CREATE SEQUENCE sequence

       [INCREMENTBY n]

       [START WITH n]

       [{MAXVALUE n | NOMAXVALUE}]

       [{MINVALUE n | NOMINVALUE}]

       [{CYCLE | NOCYCLE}]

       [{CACHE n | NOCACHE}];

建立序列

l建立序列DEPT_DEPTID_SEQ為表 DEPARTMENTS 提供主鍵 l不使用CYCLE 選項

CREATE SEQUENCE dept_deptid_seq

                INCREMENT BY 10

                START WITH 120

                MAXVALUE 9999

                NOCACHE

                NOCYCLE;

查詢序列

查詢資料字典視圖 USER_SEQUENCES 擷取序列定義資訊

   SELECT  sequence_name, min_value, max_value,

     increment_by, last_number

   FROM  user_sequences;

如果指定NOCACHE選項,則列LAST_NUMBER 顯示序列中 下一個有效的值

NEXTVAL和CURRVAL僞列

NEXTVAL 傳回序列中下一個有效的值,任何使用者都可以引用 CURRVAL 中存放序列的目前值 NEXTVAL 應在 CURRVAL 之前指定,二者應同時有效

修改序列

修改序列的增量, 最大值, 最小值, 循環選項, 或是否裝入記憶體

ALTER SEQUENCE dept_deptid_seq

               INCREMENT BY 20

               MAXVALUE 999999

               NOCACHE

               NOCYCLE;

修改序列注意事項

l必須是序列的擁有者或對序列有 ALTER權限 l隻有将來的序列值會被改變 l改變序列的初始值隻能通過删除序列之後重建序列的方法實作

删除序列

l使用DROPSEQUENCE 語句删除序列 l删除之後,序列不能再次被引用

DROP SEQUENCE dept_deptid_seq;

序列語句執行個體

SQL> --序列

SQL> create sequence myseq;

序列已建立。

SQL> create table testseq

  2  (tid number,tname varchar2(20));

表已建立。

SQL> --insert into testseq values( ,'aaa');

SQL> select myseq.currval from dual;

select myseq.currval from dual

       *

第 1 行出現錯誤: 

ORA-08002: 序列 MYSEQ.CURRVAL 尚未在此會話中定義 

SQL> select myseq.nextval from dual;

   NEXTVAL                                                                                                                                            

----------                                                                                                                                            

         1                                                                                                                                            

已選擇 1 行。

SQL> insert into testseq values(myseq.nextval ,'aaa');

已建立 1 行。

SQL> insert into testseq values(myseq.nextval ,'aaa');

已建立 1 行。

SQL> /

已建立 1 行。

SQL> select * from testseq;

       TID TNAME                                                                                                                                      

---------- --------------------                                                                                                                       

         2 aaa                                                                                                                                        

         3 aaa                                                                                                                                        

         4 aaa                                                                                                                                        

已選擇3行。

SQL> select myseq.currval from dual;

   CURRVAL                                                                                                                                            

----------                                                                                                                                            

         4                                                                                                                                            

已選擇 1 行。

SQL> hostcls

SP2-0042: 未知指令 "hostcls" - 其餘行忽略。

SQL> host cls

索引

索引:

一種獨立于表的模式對象, 可以存儲在與表不同的磁盤或表空間中 索引被删除或損壞, 不會對表産生影響, 其影響的隻是 查詢的速度 索引一旦建立, Oracle 管理系統會對其進行自動維護, 而且由Oracle 管理系統決定何時使用索引. 使用者不用在查詢語句中指定使用哪個索引 在删除一個表時, 所有基于該表的索引會自動被删除 通過指針 加速 Oracle 伺服器的查詢速度 通過快速定位資料的方法,減少磁盤I/O

建立索引

自動建立: 在定義PRIMARYKEY 或UNIQUE 限制後系統自動在相應的列上建立 唯一性索引 手動建立: 使用者可以在其它列上建立非唯一的索引,以加速查詢

l在一個或多個列上建立索引

            CREATE INDEXindex

            ON table(column[,column]...);

l在表EMPLOYEES的列LAST_NAME 上建立索引

    CREATE INDEX   emp_last_name_idx

    ON   employees(last_name);

    Index created.

何時建立索引

以下情況可以建立索引:

l列中資料值分布範圍很廣

l列經常在WHERE 子句或連接配接條件中出現

l表經常被通路而且資料量很大,通路的資料大概占資料總量的2%到4%

何時不要建立索引

下列情況不要建立索引:

l表很小

l列不經常作為連接配接條件或出現在WHERE子句中

l查詢的資料大于2%到4%

l表經常更新

查詢索引

l可以使用資料字典視圖USER_INDEXES 和USER_IND_COLUMNS 檢視索引的資訊

SELECT  ic.index_name, ic.column_name,

        ic.column_positioncol_pos,ix.uniqueness

FROM    user_indexes ix, user_ind_columns ic

WHERE   ic.index_name = ix.index_name

AND     ic.table_name = 'EMPLOYEES';

删除索引

l使用DROPINDEX 指令删除索引

     DROP INDEX index;

l删除索引UPPER_LAST_NAME_IDX

           DROP INDEX upper_last_name_idx;

l隻有索引的擁有者或擁有DROPANY INDEX權限的使用者才可以删除索引

索引語句示例

SQL> --索引

SQL> create index myindex on emp(deptno,job);

索引已建立。

SQL> --同義詞:别名

SQL> show user

USER 為 "SCOTT"

SQL> select count(*) from hr.EMPLOYEES;

select count(*) from hr.EMPLOYEES

                        *

第 1 行出現錯誤: 

ORA-00942: 表或視圖不存在 

SQL> /

  COUNT(*)                                                                                                                                            

----------                                                                                                                                            

       107                                                                                                                                            

已選擇 1 行。

同義詞

為何使用同義詞

使用同義詞通路相同的對象:

l友善通路其它使用者的對象

l縮短對象名字的長度

建立和删除同義詞

l為視圖DEPT_SUM_VU 建立同義詞

CREATE SYNONYM  d_sum

FOR dept_sum_vu;

l删除同義詞

DROP SYNONYM d_sum;

同義詞語句執行個體

SQL> create synonym hremp for hr.EMPLOYEES;

create synonym hremp for hr.EMPLOYEES

*

第 1 行出現錯誤: 

ORA-01031: 權限不足 

SQL> /

同義詞已建立。

SQL> select count(*) from hremp;

  COUNT(*)                                                                                                                                            

----------                                                                                                                                            

       107                                                                                                                                            

已選擇 1 行。

SQL> select * from tab;

TNAME                          TABTYPE  CLUSTERID                                                                                                     

------------------------------ ------- ----------                                                                                                     

DEPT                           TABLE                                                                                                                  

EMP                            TABLE                                                                                                                  

BONUS                          TABLE                                                                                                                  

SALGRADE                       TABLE                                                                                                                  

EMP10                          TABLE                                                                                                                  

EMP20                          TABLE                                                                                                                  

TESTSAVEPOINT                  TABLE                                                                                                                  

TESTDELETE                     TABLE                                                                                                                  

BIN$91xa7gtoQfiGlzbFlex5HQ==$0 TABLE                                                                                                                  

TEST3                          TABLE                                                                                                                  

MYPERSON                       TABLE                                                                                                                  

TNAME                          TABTYPE  CLUSTERID                                                                                                     

------------------------------ ------- ----------                                                                                                     

EMPINCOMEVIEW                  VIEW                                                                                                                   

TESTSEQ                        TABLE                                                                                                                  

HREMP                          SYNONYM                                                                                                                

已選擇14行。

SQL> spool off