一、同義詞:
語法:create [public] synonym [模式名.]同義詞 for [模式名.]表名
(以下例題使用的是scott模式下的emp表)
例1:(創建本模式下的私有同義詞)
create synonym emp for scott.emp;
例2:(創建其他模式下的私有同義詞)
create synonym system.emp for scott.emp; (創建system模式下的私有同義詞)
例3:(創建公有同義詞)
create public emp for scott.emp;
知識點:1、同義詞可以用來簡化SQL語句,但它不可以代替權限,在使用同義詞前要確保用戶已取得
訪問對象的權限。 比如:例3 中創建的公有同義詞 emp 在任何模式下都可以使用它,但如果
該模式沒有訪問 scott模式 的 emp 表的權限的話,在使用公有同義詞 emp 時是查不到數據的。
解決的方案是賦予此用戶訪問 scott模式 的 emp 表的權限:
grant all on scott.emp to 模式名
2、公有同義詞可以被所有用戶訪問,而私有同義詞只可以被特定的用戶訪問。比如: 例1 中
創建的私有同義詞只可以在創建它的用戶下使用, 而例2 中創建的私有同義詞只可以在 system
模式下訪問。
3、創建其它模式下的私有同義詞(例2)需要有 create any synonym 的權限, 可以在sys 或 system
模式下: grant create any synonym to 模式名, 相應的要刪除其他模式下的私有同義詞要有
drop any synonym 的權限。 創建公有同義詞(例3)需要有 create public synonym 的權限,刪除
公有同義詞要有 drop public synonym 的權限。 這些權限都可以在 sys 或 system模式下賦予。
4、刪除同義詞:
drop [public] synonym;
*擴充:1、可創建同名的私有同義詞和公有同義詞;
2、可創建與公有同義詞同名的對象,但不能創建與對象同名的公有同義詞;
3、查詢本模式下的所有同義詞: select * from user_synonyms;
二、序列:
語法: create sequence 序列名
[start with 起始值]
[increment by 增量] ----增量為正值表示是遞增序列,為負值表示是遞減序列
[maxvalue 最大值]
[minvalue 最小值]
[cycle | nocycle] ----序列達到最大(或最小)值後,是否繼續從頭開始生成值
[cache 預先緩存數 | nocache]
知識點:
1、序列用來生成唯一、連續的整數,通常用來自動生成主鍵或唯一鍵值,類似於 SQL Server 中的自增列。
2、第一次NEXTVAL返回的是初始值;隨後的NEXTVAL會自動增加你定義的INCREMENT BY值,然後返
回增加後的值。CURRVAL 總是返回當前SEQUENCE的值,但是在第一次NEXTVAL初始化之後才能使
用CURRVAL,否則會出錯。一次NEXTVAL會增加一次SEQUENCE的值,所以如果你在同一個語句裡
面使用多個NEXTVAL,其值就是不一樣的。 (注:切換用戶後nextval的值仍然會從切換前處開始接著往後增長)
例1:
CREATE SEQUENCE emp_sequence
INCREMENT BY 1 -- 每次加幾個
START WITH 1 -- 從1開始計數
NOMAXVALUE -- 不設置最大值
NOCYCLE -- 一直累加,不循環
CACHE 10;
SELECT emp_sequence .currval FROM DUAL;
SQL> SELECT emp_sequence.nextval FROM DUAL;
NEXTVAL
----------
1
SQL> SELECT emp_sequence.currval FROM DUAL;
CURRVAL
----------
1
3、 如果指定CACHE值,ORACLE就可以預先在內存裡面放置一些sequence,這樣存取的快些。cache裡
面的取完後,oracle自動再取一組到cache。 使用cache或許會跳號, 比如數據庫突然不正常down
掉(shutdown abort),cache中的sequence就會丟失. 所以可以在create sequence的時候用nocache
防止這種情況。
例2:
SQL> SELECT emp_sequence.currval FROM DUAL;
CURRVAL
----------
1
SQL> conn / as sysdba
已連接。
SQL> shutdown abort
ORACLE 例程已經關閉。
SQL> startup
ORACLE 例程已經啟動。
Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
數據庫裝載完畢。
數據庫已經打開。
SQL> conn scott/tiger
已連接。
SQL> SELECT emp_sequence.currval FROM DUAL;
SELECT emp_sequence.currval FROM DUAL
*
ERROR 位於第 1 行:
ORA-08002: 序列EMP_SEQUENCE.CURRVAL 尚未在此進程中定義
SQL> SELECT emp_sequence.nextval FROM DUAL;
NEXTVAL
----------
11
4、使用 RollBack 回滾事務時無法回滾序列的值:
例3:
SQL> SELECT emp_sequence.currval FROM DUAL;
CURRVAL
----------
1
SELECT emp_sequence.currval FROM DUAL;
CURRVAL
----------
2
roll back;
SELECT emp_sequence.currval FROM DUAL;
CURRVAL
----------
3
5、使用 alter 語句修改序列時無法修改start with項的值。
6、刪除序列:
drop sequence 序列名
7、查詢本模式下所有的序列:
select * from user_sequences;
三、視圖:
語法: create [force | noforce] view 視圖名
[ ( 別名[,別名]... ) ]
as
select 語句
[with check option] ---- 指定只能插入或更新視圖可以訪問的行
[with read only] ---- 只讀
注意: with check option 和 with read only 不可以同時使用
例1:create view view_dept
(部門編號, 部門名稱, 地址)
as
select * from scott.dept where loc in ('DALLAS', 'CHICAGO', 'BOSTON')