Oracle快速入門

Oracle安裝介質:
    OracleInstanceClient
    VirtualBox虛擬機/再安裝擴展插件(才能使虛擬機和主機共享文件)
        xxx.vdi文件.導入到VirtualBox虛擬機.
            取消虛擬機使用硬件加速(這個功能必須在主機的BIOS)裏面進行設置).
            設置網絡鏈接類型.
            關閉虛擬機防火牆(主機和虛擬機之間通訊).
            建立共享文件夾.
            網絡映射驅動器設置共享文件夾.
            安裝Oracle數據庫軟件.
        設置虛擬機的內存通常是主機內存的1/4.
    Oracle11g數據庫軟件sql

客戶端鏈接Oracle數據庫:
例如:sqlplus scott/tiger@127.0.0.1:1521/orcl數據庫

Oracle Database 客戶機
    SQLDevloper Java開發能夠在任何平臺上使用.
    PLSQLDevloper只能在window系統使用.express

一個Oracle服務器:
    是一個數據庫管理系統(RDBMS).它提供開放的,全面的,近乎完整的信息管理.
    是由一個Oracle數據庫和多個實例組成.windows

Oracle存放數據庫目錄:
oradata
    orcl
        *.ctl控制文件,記錄數據庫的結構
        *.dbf數據文件,存放數據.
        *.log日誌文件.數組

多個實例訪問一個數據庫,這就是Oracle數據庫集羣.
    內存A(實例) |----------
                |
    內存B(實例) |----------            [Oracle數據庫:Orcl,物理概念]
                |
    內存C(實例) |----------tomcat

項目集羣:
    TomcatA |            
            |            
    TomcatB    |(prj.war)    (MYSQL數據庫)
            |
    TomcatC |
只要有tomcat能夠訪問MYSQL數據庫.項目就能夠正常運行.安全

集羣(cluster)的優勢:
    1.Load Balance 負載均衡:減輕服務器壓力.
    2.Fail Over 失敗遷移:提升系統的可靠性.服務器

Oracle集羣的專有名詞,RAC : Real Application Cluster網絡

Oracle內存中的實例如何操做硬盤上的數據庫文件?
經過操做系統進程:
    讀
    寫
                        內存/實例
                        (PGA : Program Global Area)        ---|                                                             -|
Oracle客戶端 ------|     (PGA)                            ---| --- (SGA : System Global Area) - (經過操做系統進程:讀、寫) -| (Oracle數據庫:orcl)
                        (PGA)                            ---|                                                             -|併發

Oracle命令:

-- 清理屏幕數據
HOST CLS;

-- 查看當前用戶
SHOW USER;

-- 查看當前用戶下的表
SELECT * FROM TAB;

-- 查看錶結構
DESC/DESCRIBE 表名;

查看行寬:SHOW LINESIZE;
設置行寬:SET LINESIZE 值;

-- 設置列寬:
COL/COLUMN 列名稱 FOR/FORMAT a1(表明一個字符寬度)/9(表明一個數字寬度);

*** Oracle執行時間開關(默認關閉):SET TIMING ON|OFF(開啓|關閉);

*** 別名 AS,給表起別名不能使用AS.
    WHERE、HAVING後面的條件不能使用別名.

*** 查詢一個值是不是空值:
SELECT * FROM ... WHERE comm IS [NOT] NULL;

*** Oracle中的濾空函數:
    1.NVL(a,b):
        當a的值爲空的時候,返回b值,不然返回a值
    2.NVL2(a,b,c):
        表示當a爲NULL的時候,返回c,不然返回b.

*** Oracle錄屏命令:
    開始:SPOOL txt文件路徑;
    結束:SPOOL OFF;
        
*** / 表示執行上一條SQL語句.

*** 修改錯誤SQL語句:
    1.使用CHANGE/C命令
    2.使用ED/EDIT命令

*** 在上一條SQL語句追加SQL語句:
    使用A/APPEND命令:(至少要有兩個空格)
    
*** SQL優化原則:
    1.儘可能使用列名錶明*
    2.Oracle判斷WHERE條件的順序:從右往左。
    3.儘可能使用WHERE代替HAVING.
    4.理論上多表查詢的效率優於子查詢.
    5.儘可能不要使用集合運算.

*** SQL中的空值:
    1.包含空值NULL的表達式結果都爲NULL
    2.NULL 永遠不等於 NULL
    3.查詢的字段有空值,不可使用NOT IN來查詢.
    4.NULL空值的排序,空值最大.在此排序後加上 NULLS LAST 以控制排序效果
    5.分組函數在計算時會自動過濾掉空值.
        解決:能夠經過濾空函數來處理.
    
*** 僞表:DUAL
    是Oracle管理員提供的僞表,存在僅僅是爲了知足語法的要求.

*** 僞列:
        LEVEL : 在層次查詢中表明查詢的深度.
        ROWNUM : 行號,永遠按照默認的順序生成.
                行號只能使用 < <= 符號不能只用 > >= 符號.
                對於 = 等號只能使用 ROWNUM=1.
                由於Oracle是行式數據庫,只能每行讀取.
        ROWID:行地址,至關於一個指針,它表示指向到數據文件的位置.(*.dbf數據文件)
        
*** 臨時表:
        手動建立:CREATE GLOBAL TEMPORARY TABLE 表名(...);
        ORDER BY 在排序的時候回自動建立.
        臨時表特色:
            臨時表當事務或會話結束的時候,表中的數據會自動刪除.
    
*** SQL字符串鏈接:
    1.鏈接函數:CONCAT('hello','world')
        MYSQL:SELECT CONCAT('hello','world');
        ORACLE:SELECT CONCAT('hello','world') FROM DUAL;
    2.鏈接符: || 

*** 行轉列函數:WM_CONCAT(...) 屬於分組函數.

*** WHERE 子句中不能使用別名.

*** Oracle中去掉碎片:
    1.ALTER TABLE 表名 MOVE;
    2.先導出、再導入碎片就會被移除.

*** Oracle執行SQL腳本:
    @SQL腳本路徑

*** Oracle開啓關閉操做數據的回顯信息:
    SET FEEDBACK ON(開,默認)|OFF(關);
    
Oracle查詢語句:
SELECT [ALL/DISTINCT] * FROM ...
    [ALL/DISTINCT]做用於全部列

*** 查詢字符串類型大小寫敏感.
*** 查詢日期類型格式敏感.
    Oracle數據庫默認的日期格式:DD-MON-RR(日-月-年)
    能夠進行修改
*** Oracle查詢日期格式:
    SELECT * FROM V$NLS_PARAMETERS;
*** Oracle修改日期格式:
    ALTER SESSION/SYSTEM SET NLS_DATE_FORMAT = 'yyyy-mm-dd';

*** 日期類型和日期類型之間只能進行減法運算.

*** Oracle鏈接數據庫的三種認證方式:
密碼認證.
    sqlplus 用戶名/密碼@ip:端口號/數據庫名
    sqlplus 用戶名/密碼 as sysdba
主機認證.
    sqlplus / as sysdba|system
全局認證.
    
比較運算符:
>大於 、 >=大於等於 、 <小於 、 <=小於等於 、!=(<>)不等於
BETWEEN ... AND ...
[NOT] IN
LIKE 'pattern(%_)' *** 模糊查詢包含下劃線的字符就須要轉義:'\_'
IS [NOT] NULL

邏輯運算符:
AND 而且
OR 或
NOT 非

Oracle排序:ORDER BY子句:
ORDER BY 排序字段(列名、表達式、別名、序號(列的索引,從1開始)) ASC(升序,默認)|DESC(降序)

Oracle函數:
    函數必須有返回值,可是能夠沒有參數.
單行函數:
    1.字符函數:
        LOWER 轉小寫
        UPPER 轉大寫
        INITCAP 首字母大寫 
        
        CONCAT 鏈接函數 CONCAT(a,b)
        SUBSTR 截取函數    SUBSTR(a,b,c);
            表示從a中的b位置開始截取,取c位.
        LENGTH(單位:字符)/LENGTHHN(單位:字節) 獲取字符串大小
        INSTR 查詢函數,INSTR(a,b) 表示在a中查找b.
        LPAD(左填充)/RPAD(右填充)
            LPAD('abcd',10,'*') 、RPAD('abcd',10,'*')
        TRIM 去除兩端字符 TRIM(a FROM b)表示從b的兩端去除包含a的字符串.
        REPLACE 替換函數 REPLACE(a,b,c) 表示在a中出現的b字符使用c替換.
    2.數字函數:
        ROUND 四捨五入 ROUND(a,b)表示對數值a保留多少位小數.
        TRUNC 截斷
        MOD 求餘 MOD(a,b) 表示a對b求餘.
    3.日期函數:
        TO_CHAR : TO_CHAR(a,b) 表示將a值按照b格式化爲一個字符串.
            例如:SELECT TO_CHAR(SYSDATE,'yyyy-mm-dd hh24:mi:ss') FROM DUAL;
        MONTHS_BETWEEN 兩個日期類型相差的月數.
        ADD_MONTHS 向指定的日期中加上若干個月數.
        NEXT_DAY 指定日期的下一個日期.
            例如:SELECT NEXT_DAY(SYSDATE,'星期五') FROM DUAL;
            NEXT_DAY的應用:每一個星期一自動備份數據.
        LAST_DAY 本月的最後一天.
        ROUND    日期四捨五入.
            ROUND(SYSDATE,'YEAR') , ROUND(SYSDATE,'MONTH')
        TRUNC    日期截斷.
            TRUNC(SYSDATE,'YEAR') , TRUNC(SYSDATE,'MONTH')
    4.轉換函數:
        隱式轉換:Oracle系統自動完成.
            源數據類型        -->        目標數據類型
            VARCHAR2或CHAR            NUMBER或DATE
            NUMBER或DATE            VARCHAR2
        顯示轉換:
                        TO_CHAR->                    <-TO_CHAR
            NUMBER        ---            CHARACTER        ---            DATE
                        <-TO_NUMBER                    TO_DATE->
        
        TO_CHAR : TO_CHAR(a,b) 表示將a值按照b格式化爲一個字符串.
            例如:SELECT TO_CHAR(SYSDATE,'yyyy-mm-dd hh24:mi:ss') FROM DUAL;
            
        日期格式的元素:字符串和日期之間的轉換。
            YYYY
            YEAR
            MM
            MONTH
            DY
            DAY
            DD
            hh24
            mi
            ss
        數字格式的元素:字符串和數值之間的轉換。
            9 數字
            0 零
            $ 美圓福
            L 本地貨幣符號
            . 小數點
            , 千位符
    5.通用函數:適用於任何數據類型,也適用於空值.
        NVL(a,b) 表示當a爲NULL的時候,返回b,不然返回a.
        NVL2(a,b,c) 表示當a爲NULL的時候,返回c,不然返回b.
        NULLIF(a,b) 表示當a等於b的時候返回NULL,不然返回a.
        COALESCE(a,b,...,n) 表示從左往右返回第一個不爲空的值.
    6.條件表達式:很實用.
        CASE 表達式:屬於SQL99語法.
            CASE express 
                WHEN 值1 THEN 處理1
                WHEN 值2 THEN 處理2
                ...
                ELSE 默認處理
            END
        DECODE 函數:Oracle本身的語法.
            DECODE(express,值1,處理1,...,值n,處理n,默認處理);
多行函數:分組函數
    AVG 求平均值
    COUNT 計數
    MAX 取最大值
    MIN 取最小值
    SUM 求和函數

GROUP BY 子句:

求部門的平均工資大於2000的部門?
SELECT DEPTNO,AVG(NVL(SAL,0)) AS "平均工資" 
FROM EMP
GROUP BY DEPTNO
HAVING AVG(NVL(SAL,0)) > 2000
ORDER BY "平均工資" DESC;

WHERE和HAVING的區別?
    1.WHERE後面不能有分組函數.HAVING能夠.
    2.WHERE在查詢數據進入內存以前過濾數據.
    3.HAVING在查詢數據進入內存以後過濾數據.
 
向上彙報:ROLL UP . GROUP BY語句的加強.
...GROUP BY ROLLUP(express1,express2,...)

*** BREAK ON DEPTNO SKIP 2 格式修飾.
    BREAK ON NULL 取消格式修飾.

問題:
--------------------------------
    DEPTNO JOB         工資總和
---------- --------- ----------
        10 CLERK           1300
           MANAGER         2450
           PRESIDENT       5000
                           8750


        20 CLERK           1900
           ANALYST         6000
           MANAGER         2975
                          10875

                          
        30 CLERK            950
           MANAGER         2850
           SALESMAN        5600
                           9400


                          29025
-------------------------------------------------
實現上面效果:
BREAK ON DEPTNO SKIP 2;
SELECT DEPTNO,JOB,SUM(SAL) AS "工資總和" 
FROM EMP
GROUP BY ROLLUP(DEPTNO,JOB);
BREAK ON NULL;

多表查詢:
    笛卡爾集:是多表查詢的基礎.
    多表查詢的鏈接條件能夠避免所有的笛卡爾集.

鏈接的類型:
Oracle鏈接類型                SQL99鏈接類型
等值鏈接                    CROSS JOINS
不等值鏈接                    NATURAL JOINS
外鏈接                        USING CLAUSE
自鏈接                        FULL OR TWO SIDED OUTER JOINS

(不)等值鏈接:
查詢員工號、姓名、月薪、部門名稱?
SELECT e.EMPNO,e.ENAME,e.SAL,d.DNAME
FROM EMP e,DEPT d
WHERE e.DEPTNO = d.DEPTNO;

外鏈接:
按照部門統計員工人數,顯示部門號、部門名稱、部門人數?
Oracle語法:
    SELECT d.DEPTNO,d.DNAME,COUNT(e.EMPNO)
    FROM DEPT d,EMP e
    WHERE e.DEPTNO = d.DEPTNO(+)
    GROUP BY d.DEPTNO,d.DNAME;
SQL99語法:
    SELECT d.DEPTNO,d.DNAME,COUNT(e.EMPNO)
    FROM DEPT d
    LEFT JOIN EMP e
    ON e.DEPTNO = d.DEPTNO
    GROUP BY d.DEPTNO,d.DNAME;

自鏈接:經過表的別名,將同一張表視爲多張表使用.
        自鏈接不適合操做大數據的表.
        當數據過大時,使用層次查詢代替.
查詢員工信息:員工的姓名 、 老闆的姓名.
SELECT E1.ENAME 員工姓名, E2.ENAME 老闆姓名
FROM EMP E1,EMP E2
WHERE E1.MGR = E2.EMPNO;
-----------------------------
員工姓名   老闆姓名
---------- ----------
FORD       JONES
SCOTT      JONES
TURNER     BLAKE
ALLEN      BLAKE
WARD       BLAKE
JAMES      BLAKE
MARTIN     BLAKE
MILLER     CLARK
ADAMS      SCOTT
BLAKE      KING
JONES      KING
CLARK      KING
SMITH      FORD
-----------------------

層次查詢:
    在層次查詢當中,只能有一張表.
SELECT LEVEL,ENAME, MGR
FROM EMP
CONNECT BY PRIOR EMPNO = MGR
-- 若是是從根節點開始遍歷:還能夠換一個方式寫.
-- START WITH MGR IS NULL
START WITH EMPNO = 7839 -- 從這個節點往下遍歷.
ORDER BY 1;

子查詢:

查詢月薪比SCOTT員工高的員工信息?
SELECT * 
FROM EMP 
WHERE SAL > (SELECT SAL FROM EMP WHERE ENAME='SCOTT');

*** 寫子查詢注意的問題:
1.括號的使用.
2.合理的書寫風格.
3.能夠在主查詢的 WHERE、 SELECT、 HAVING、 FROM 後面放置子查詢.
    (1)SELECT後面的子查詢語句只能是單行子查詢.
    
4.不能夠在GROUP BY後放置子查詢.
5.FROM 後面的子查詢.
    (1)子查詢的結果做爲主查詢的數據源.
        在已知的條件上增長新條件.
6.主查詢和子查詢能夠是不一樣表,只要子查詢返回的結果主查詢可使用便可.
    
7.通常不對子查詢進行排序.但在TOP-N問題分析中,必須對子查詢進行排序.
    
8.通常先執行子查詢再執行主查詢,可是相關子查詢例外.
    (1)相關子查詢:
        將主查詢中的某些值做爲參數傳遞給子查詢,
        
9.單行子查詢只能使用單行操做符,多行子查詢只能使用多行操做符.
    單行操做符:= 、 > 、 >= 、 < 、 <= 、 !=(<>)
    多行操做符:IN 、 ANY:任何 、 ALL:所有
10.子查詢中的NULL空值問題.

練習題:
1.找到員工工資最高的前三名,顯示:序號、員工編號、姓名、月薪?
SELECT ROWNUM,E.*
FROM 
    (SELECT E.*
    FROM EMP E
    ORDER BY E.SAL DESC) E
WHERE ROWNUM <= 3;

*** 擴展:Oracle使用ROWNUM實現分頁查詢?
SELECT E.*
FROM
    (SELECT ROWNUM R,E.*
    FROM
        (SELECT E.* 
        FROM EMP E 
        ORDER BY E.SAL DESC) E
    WHERE ROWNUM <= high) E
WHERE E.R >= low;

pageNo : 當前頁.
pageSize : 頁大小.
lastNum : (pageNo - 1) * pageSize
low :  lastNum + 1
high : lastNum + pageSize
    
2.找到員工表月薪大於本部門平均薪水的員工
    顯示:員工編號、姓名、月薪、部門平均月薪?
語法一:
SELECT E.DEPTNO,E.SAL,AVGE.AVGSAL
FROM EMP E,
    (
    SELECT E.DEPTNO,AVG(NVL(E.SAL,0)) AVGSAL
    FROM EMP E
    GROUP BY E.DEPTNO
    ) AVGE
WHERE E.DEPTNO = AVGE.DEPTNO
    AND E.SAL > AVGE.AVGSAL;

語法二:
SELECT E.DEPTNO,E.SAL,(SELECT AVG(E1.SAL) AVGSAL FROM EMP E1 GROUP BY E1.DEPTNO HAVING E1.DEPTNO = E.DEPTNO) AS "DEPTAVGSAL"
FROM EMP E
WHERE E.SAL > (SELECT AVG(E1.SAL) AVGSAL FROM EMP E1 GROUP BY E1.DEPTNO HAVING E1.DEPTNO = E.DEPTNO);

3.統計每一年入職的員工個數
    顯示:總數、年份1,年份2,...?
-- 計數思想.

集合運算:
1.並集:UNION [DISTINCT(默認)|ALL].
2.交集:INTERSECT.
3.減集:MINUS.

使用集合運算注意的問題:
1.參與集合運算的各個集合必須列數相同、列類型一致。
2.採用第一個集合的表頭做爲集合的表頭。
3.ORDER BY 對集合排序寫在最後。
4.使用括號。

Oracle中的表類型:
1.標準表
2.臨時表
3.索引表

SQL的新增、修改、刪除:

SQL類型:
1.DML(Data Manipulation Language 數據操做語言): 
    INSERT(增)、 UPDATE(改)、 DELETE(刪)、 SELECT(查)
2.DDL(Data Definition Language 數據定義語言):
    CREATE DROP TRUNCATE TABLE(二維表)
    CREATE DROP VIEW(視圖)
                SEQUENCE(序列)
                INDEX(索引)
                SYNONYM(同義詞)
3.DCL(Data Control Language 數據控制語言):
    GRANT(受權)
    REVOKE(撤銷權限)

INSERT插入、新增操做:
語法:
INSERT INTO 表名[(列1,列2,...)] VALUES(值1,值2,...)[,(值1,值2,...)];

*** Oracle中的地址符 & 用法至關靈活.·
    至關於PrepareStatement
用於新增:
    INSERT INTO 表名[(字段列表)] VALUES(&column1,&column2,...);
用於查詢:
    SELECT * FROM &TABLENAME;

批處理:
    建立一張表結構與EMP表結構相同.
    CREATE TABLE EMP10 AS SELECT * FROM EMP WHERE 1=2;
    
    將EMP表中的數據批量插入到EMP10表中?
    INSERT INTO EMP10 SELECT * FROM EMP WHERE DEPTNO = 10;

    思考:如何海量插入數據?
        1.數據泵.
        2.SQL*LOADER工具
        3.使用外部表.

UPDATE更新:
語法:
UPDATE 表名 SET 字段=值(數值,子查詢返回結果) WHERE ...

DELETE、TRUNCATE 刪除:
    DELETE和TRUNCATE的區別?
        1.DELETE逐條記錄刪除,TRUNCATE先刪除表,再重建表.
        2.DELETE屬於DML(能夠回滾),TRUNCATE屬於DDL(不能夠回滾).
        3.DELETE不會釋放空間,TRUNCATE會釋放空間.
        4.DELETE會產生碎片,TRUNCATE不會產生碎片.
            碎片的產生會影響查詢效率.
        5.DELETE能夠閃回(FLASHBACK),TRUNCATE不能夠閃回

Oracle碎片圖解:
Oracle一張二維表中數據是從後往前存儲.
--------------------------------------------

Oracle指針:
HWM(High Water Mark 高水位線)
---------------------------->

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

*** DELETE操做的效率比TRUNCATE效率高.
    緣由:DELETE操做並非真正的被刪除,知識把數據換個地方存儲.
        UNDO表空間.

Oracle數據庫事務:
    Oracle屬於自動開啓事務.
1.起始標識:事務中的第一條DML語句.
2.結束標識:
    (1)提交:
        顯示提交:COMMIT
        隱式提交:EXIT(退出)、DDL、DCL
    (2)回滾:
        顯示回滾:ROLLBACK [TO SAVEPOINT 保存點名稱]
        隱式回滾:非正常退出、掉電...

定義事務保存點:SAVEPOINT 保存點名稱;

數據庫的隔離級別:

SQL99提供的4種事務隔離級別:
    1.READ UNCOMMITTED (讀未提交數據):
        容許事務讀取未被其它事務提交的變動,髒讀,不可重複讀,幻讀的問題都會出現.
    2.READ COMMITTED (讀已提交數據):
        只容許事務讀取其它事務提交的變動,能夠避免髒讀,可是不可重複讀和幻讀的問題會出現.
    3.REPEATABLE READ (可重複讀):
        確保事務能夠屢次從一個字段中讀取相同的值,在這個事務持續期間,禁止其它事務對這個字段進行更新,
        能夠避免不可重複讀,可是幻讀的問題任然存在.
    4.SERIALIZABLE (串行化):
        確保事務能夠從一個表中讀取相同行,在這個事務持續期間,禁止其它事務對該表進行
        插入、新增和刪除.全部的併發問題均可以免.可是性能十分低下.

Oracle中有3種事務隔離級別:
    1.READ COMMITTED(讀已提交數據,默認)
    2.SERIALIZABLE(串行化)
    3.READ ONLY(只讀)

建立和管理二維表:

建立表條件:
    1.具備CREATE TABLE權限
    2.有存儲空間
建立表必須指定:
    表名、列名、數據類型、數據類型大小

建立表:
1.CREATE OR REPLACE TABLE 表名 (
    列名 數據類型 [數據約束],
    ...
);
2.CREATE OR REPLACE TABLE 表名[字段列表] AS (SubQuery);

操做表字段:
    1.新增一個字段:
        ALTER TABLE 表名 ADD 字段名 數據類型 [數據約束];
    2.修改列屬性:
        ALTER TABLE 表名 MODIFY 字段名 新數據類型 [數據約束];
    3.修改列名稱:
        ALTER TABLE 表名 RENAME COLUMN 原字段名 TO 新字段名;
    4.刪除一個字段:
        ALTER TABLE 表名 DROP COLUMN 字段名;
修改表名:
    RENAME 原表名 TO 新表名;

刪除|清空表數據:
    DELETE|TRUNCATE TABLE 表名;
刪除表:
    DROP TABLE 表名;
        刪除的表被放置到Oracle回收站中.

*** Oracle數據類型:
VARCHAR2(SIZE):可變長字符串.
CHAR(SIZE):定長字符串.
NUMBER(P,S):可變長數值.
DATE:日期型數據.
LONG:可變長字符數據,最大可達到2G.
CLOB:字符數據,最大可達到4G.
RAW AND LONG RAW:原始的二進制數據.
BLOB:二進制數據,最大可達到4G.
BFILE:存儲外部的二進制數據,最大可達到4G.
ROWID:行地址.

*** 數據的完整性約束:
    約束是表一級的限制.
    若是存在依賴關係,約束能夠防止刪除錯誤數據.
    約束的類型:
        NOT NULL:非空約束
        UNIQUE:惟一約束
        PRIMARY KEY:主鍵約束
        FOREIGN KEY:外鍵約束,
            主表的外鍵必須是副表的主鍵.
        CHECK:
            GENDER VARCHAR2(1) CHECK(GENDER IN('0','1')),
            SAL NUMBER(10,2) CHECK(SAL > 0)

*** 查看Oracle回收站:
        SHOW RECYCLEBIN;
    清空Oracle回收站:
        PURGE RECYCLEBIN;
    查看回收站表數據:
        SELECT * FROM "回收站表名";
    
*** CONSTRAINT:使用 CONSTRAINT 對約束命名.

*** 字段 CONSTRAINT 外鍵名稱 [FOREIGN KEY] REFERENCES 表名(字段列表) 
    ON DELETE SET NULL
    ON UPDATE CASCADE

視圖VIEW:
    視圖是一張虛表。
    視圖創建在已有的表基礎之上。
視圖的優勢:
    簡化查詢。
    限制數據操做權限。
視圖建立:
CREATE OR REPLACE VIEW 視圖名
AS (SubQuery) 
[WITH CHECK OPTION] [WITH READ ONLY];

*** 不建議經過視圖對錶進行修改.

刪除視圖:DROP VIEW 視圖名;

SEQUENCE序列:
    與AUTO_INCREMENT同樣.
    就是一個數組,事先放置到內存當中.
    能夠提升效率.

建立序列SEQUENCE:
CREATE SEQUENCE 序列名
[INCREMENT BY n]
[START WITH n]
[MAXVALUE n | NOMAXVALUE]
[MINVALUE n | NOMINVALUE]
[CYCLE | NOCYCLE] -- 數組是否循環
[CACHE n | NOCACHE]; --數組默認長度

操做指針從序列中取出數據:
    CURRVAL : 存放序列的當前值.
    NEXTVAL : 存放指針的下一個值.
取值:序列名.CURRVAL|NEXTVAL

序列在下列狀況下會出現裂縫:
    1.回滾
    2.系統異常
    3.多個表共用一個序列

若是不講序列的值裝入內存,可使用
USER_SEQUENCES表查看序列的當前有效值.

修改序列:
ALTERE SEQUENCE 序列名
[INCREMENT BY n]
[START WITH n]
[MAXVALUE n | NOMAXVALUE]
[MINVALUE n | NOMINVALUE]
[CYCLE | NOCYCLE] -- 數組是否循環
[CACHE n | NOCACHE]; --數組默認長度

刪除序列:
DROP SEQUENCE 序列名;

索引INDEX:
建立索引:
    CREATE INDEX 索引名稱 ON 表名(字段列表);
索引表由Oracle數據庫自動維護.

刪除索引:
    DROP INDEX 索引名稱;
    刪除索引必須擁有DROP ANY INDEX權限.

同義詞SNYONYM:就是別名
    能夠表明任意的數據庫對象.
    
建立同義詞:
    CREATE [PUBLIC] SNYONYM 同義詞名稱 FOR [用戶名.]表|視圖...
    同義詞的建立必須具備CREATE SNYONYM權限.
刪除同義詞:
    DROP SNYONYM 同義詞名稱;

PLSQL程序設計:Oracle自創語法.
    操做數據庫的複雜邏輯.
    相似使用Java Jdbc操做Oracle.
    Oracle對SQL語言的擴展.執行效率高.

*** 開啓|關閉Oracle的輸出開關:SET SERVEROUTPUT ON|OFF(默認);

*** 查看Oracle PLSQL程序包 DESC|DESCRIBE 程序包名稱;

*** 接收鍵盤輸入:ACCEPT 地址名 PROMPT '提示語';
    使用鍵盤輸入值:&地址名
    地址名存儲的是輸入值得地址名,這個地址保存了輸入的值.

PLSQL語法格式:
DECLARE 
    -- 聲明變量、光標、例外
BEGIN
    -- 語句序列.
    DBMS_OUTPUT.PUT_LINE('hello world!');
EXCEPTION
    -- 例外處理語句.
END;
/

什麼是PLSQL?
1.PLSQL(Procedure Language Structured Query Language).
2.PLSQL是Oracle對SQL語言的過程化擴展.
3.指在SQL命令語言中增長了過程處理語句(例如:分支、循環等),
使SQL語言具備過程處理能力.

PLSQL變量和常量:

變量語法格式:
    變量名 數據類型 [:=初始值];
常量語法格式:
    變量名 CONSTANT 數據類型 [:=初始值];

變量數據類型:
    CHAR
    VARCHAR
    DATE
    NUMBER
    BOOLEAN
    LONG
    EMP.ENAME%TYPE 引用型變量
    EMP%ROWTYPE 記錄型變量

PLSQL條件語句:
語法格式:
IF 表達式1 THEN 處理語句1
    ELSIF 表達式2 THEN 處理語句2
    ...
    ELSIF 表達式n THEN 處理語句n
    ELSE 另外處理語句
ENDIF;

循環語句:
1.
WHILE 表達式
LOOP
    -- 循環體.
END LOOP;

*** 相似Java中的WHILE循環.
2.
LOOP
    EXIT 表達式
    -- 循環體
END LOOP;

*** 相似Java中的DO...WHILE循環.
3.
FOR 變量名 IN 表達式
LOOP
    -- 循環體
END LOOP;

*** 相似Java中的FOR循環.

CURSOR光標|遊標:
    相似Java中的ResultSet.
聲明光標CURSOR格式:
CURSOR 光標名稱 [(參數名 數據類型[,參數名 數據類型]...)]
IS SELECT 語句(可使用光標參數);

光標用於存儲一個查詢返回的多行數據.

操做光標:
打開光標:OPEN 光標名稱[(參數值[,參數值]...)];
取一行光標值:FETCH 光標名稱 INTO 變量;
關閉光標:CLOSE 光標名稱;

光標的屬性:返回TRUE|FALSE
    %ISOPEN 是否開啓
    %ROWCOUNT 影響的行數.
    %FOUND 找到
    %NOTFOUND 未找到
使用方式:
    光標名稱+光標屬性(返回TRUE|FALSE)
    
練習:
1.使用光標查詢員工的姓名和月薪,並打印?
2.查詢某個部門的員工信息?

例外EXCEPTION:
    例外是程序設計語言提供的一種功能,
    用來加強程序的健壯性和容錯性.

*** Java程序中的例外EXCEPTION:
Java例外處理機制:向上拋出.
try{
    ...
}catch(Exception e1){
    ...
}catch(Exception e2){
    ...
}finally{
    ...
}

Oracle的系統定義異常:
    NO_DATA_FOUND:未找到數據異常。
    TOO_MANY_ROWS:SELECT ... INTO ... 語句匹配多行記錄異常。
    ZERO_DIVIDE:被零除異常。
    VALUE_ERR:算術異常或轉換異常。
    TIME_OUT_RESOURCE:等待資源時發生超時異常。

Oracle用戶自定義異常:
    異常名稱 EXCEPTION;

向EXCEPTION拋出異常:
    RAISE 異常名稱;

被零除異常問題?
SET SERVEROUTPUT ON;
DECLARE
    PNUM NUMBER := 1;
    
    VALUE_ONE EXCEPTION;
    -- 1.自定義異常.
BEGIN
    PNUM := 1/0;
    
    IF PNUM = 1 THEN RAISE VALUE_ONE;
    -- 2.拋出異常.
EXCEPTION
    WHEN ZERO_DIVIDE 
    THEN DBMS_OUTPUT.PUT_LINE('系統出現異常!');
         DBMS_OUTPUT.PUT_LINE('0不能做爲被除數!')
    WHEN VALUE_ERR 
    THEN DBMS_OUTPUT.PUT_LINE('算術或者轉換異常!');
    WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('未知異常!');
    
    WHEN VALUE_ONE THEN DBMS_OUTPUT.PUT_LINE('值爲1');
    -- 3.處理異常.
END;
/

使用PLSQL處理Oracle數據庫問題步驟:
1.需求分析
    2.概要設計HIGH LEVEL DESIGN
      詳細設計LOW LEVEL DESIGN
        3.編碼CODING
            4.測試TEST
                5.上線APPLICATION

使用PLSQL處理Oracle問題考慮的問題:
    1.SQL語句.
    2.變量:初始值,如何獲得

*** Java的垃圾回收機制不受Java代碼的控制。
Java中System類下的gc()函數只是請求調用Java回收機制.
Java回收機制受虛擬機內存:-Xms100M -Xmx200M影響.
當Java的內存已滿,Java會優先回收最近最少使用的垃圾.

OUT參數中使用遊標:
    *** 必須將存儲過程放到程序包中.
建立包頭:
    CREATE [OR REPLACE] PACKAGE 包名 AS
        TYPE empcursor IS REF CURSOR;
        PROCEDURE queryEmpList(dno IN NUMBER,empList OUT empcursor);
    END 包名;

建立包體:
    CREATE [OR REPLACE] PACKAGE BODY 包名 AS
        PROCEDURE 存儲過程名稱(dno IN NUMBER,empList OUT empcursor)
        BEGIN
            OPEN empList FOR SELECT * FROM EMP WHERE DEPTNO = dno;
        END 存儲過程名稱;
    END 包名;

觸發器TRIGGER:

觸發器是一個與表相關聯的、存儲的PLSQL程序.每當一個特定的
SQL操做語句(INSERT,UPDATE,DELETE)在指定的表上發出的時候,
數據庫會自動的執行觸發器中定義的語句序列.

觸發器的類型:
1.語句級觸發器:
    在指定的操做語句以前或以後執行一次,
    無論這條語句影響了多少行.
2.行級觸發器(FOR EACH ROW):
    觸發語句做用的每一條記錄都會被觸發,在行級觸發器中
    使用 :old 和 :new 僞記錄變量,識別值得狀態.

建立觸發器語法格式:
CREATE [OR REPLACE] TRIGGER 觸發器名稱
BEFORE|AFTER
INSERT|UPDATE|DELETE [OF 字段列表]
ON 表名
[FOR EACH ROW [WHEN(條件)]]
DECLARE
    -- 聲明變量.
BEGIN
    -- 實現邏輯語句.
EXCEPTION
    -- 例外處理語句.
END;
/

*** 觸發器與僞記錄變量的值:
觸發語句        :old                            :new
INSERT            全部字段都是NULL空值            將要插入的數據
UPDATE            更新以前改行的值                更新改行後的值
DELETE            刪除改行以前的值                全部的字段都是NULL空值

*** Oracle觸發器中拋出異常,建議使用RAISE_APPLICATION_ERROR(errorCode,errorMessage)
    函數拋出. errorCode錯誤代碼範圍:(-20999,-20000).

練習:
1.商品庫存和訂單問題?
2.複雜的安全性檢查,禁止在非工做時間插入新員工信息?
非工做時間:
    (1)週末
    (2)上班前9.30,下班後6.30
3.數據確認,員工漲工資不能漲長越少?

*** 觸發器總結:
觸發器應用:
    1.數據確認.
    2.實施複雜的安全性檢查.
    3.作審計,跟蹤表上所作的數據操做等.
        Oracle數據庫已經作了審計功能.
    4.數據的備份和同步.

查詢觸發器、過程以及函數:
    SELECT * FROM USER_TRIGGERS;
    SELECT * FROM USER_SOURCE;

存儲過程PROCEDURE和存儲函數FUNCTION:

是指在數據庫中供全部用戶程序調用的子程序
叫存儲過程、存儲函數.

存儲過程PROCEDURE和存儲函數FUNCTION的最大區別:
存儲函數能夠經過RETURN返回結果.

建立存儲過程:
CREATE [OR REPLACE] PROCEDURE 存儲過程名稱(形參列表)
AS
DECLARE
    -- 聲明變量.
BEGIN
    -- 執行語句.
EXCEPTION
    -- 例外處理語句.
END;
/

*** Oracle存儲過程形式參數的定義
    格式:形參名稱 IN|OUT|INOUT 數據類型

調用存儲過程:
1.EXECUTE/EXEC 存儲過程名稱;
2.在PLSQL中調用存儲過程:
DECLARE
BEGIN
    存儲過程名稱(實參列表);
END;
/

練習:
1.給指定的員工漲指定額外的工資?

存儲函數FUNCTION:
函數(FUNCTION)是一個命名的存儲程序,能夠帶參數,
並返回一個值,函數和過程的結構相似,可是必須有一
個RETURN子句,用於返回函數值.函數說明要指定函數
名稱,結果值的類型,以及參數類型等.

Oracle建立存儲函數:
CREATE [OR REPLACE] FUNCTION 函數名(形參列表)
RETURN 返回函數值的數據類型
AS
DECLARE
    -- 聲明變量.
BEGIN
    -- 邏輯處理語句.
EXCEPTION
    -- 異常處理語句.
END;
/

調用存儲函數FUNCTION:
1.SELECT 函數名(實參列表) FROM DUAL;
2.PLSQL調用函數.

*** 何時使用存儲過程,何時使用存儲函數?
    原則:若是隻有一個返回值,使用存儲函數,不然
        使用存儲過程.

*** 存儲過程和存儲函數中的形參類型IN和OUT:
    
    通常來講,存儲過程和函數的區別就是在於函數
    能夠有一個返回值,而存儲過程沒有.
    
    可是存儲過程和函數均可以經過OUT制定一個或
    多個輸出參數.咱們能夠利用OUT參數,在存儲過
    程和函數中實現返回多個值.

練習:
1.查詢某個員工的姓名、月薪、職位?

數據字典DICTIONARY:

Oracle中的二維表:
    1.基本表
        描述數據庫信息,只能由數據庫
        服務器進行修改.
    2.用戶表
        用戶自定義表.

Oracle數據字典總表:DICTIONARY.

數據字典命名規則:
前綴        說明
USER        用戶本身的.
ALL            用戶能夠訪問到的.
DBA            管理員視圖.
V$            性能相關的數據,動態性能視圖.

USER_OBJECTS:
經過查詢USER_OBJECTS能夠肯定當前用戶建立的全部對象.
能夠獲取一下信息:
DATE CREATED -- 建立時間
DATE OF LAST MODIFICATION 最後一次修改時間.
STATUS(狀態:VALID(有效) 、 INVALID(無效))

ALL_OBJECTS:
能夠經過查詢ALL_OBJECTS來肯定當前用戶能訪問
的數據庫對象.

數據庫管理:

利用DBCA(Database Configuration Assistant)建立Oracle數據庫:
在安裝Oracle的時候能夠選擇安裝ORCL數據庫,
可是在真實的環境中,不要使用DBCA安裝ORCL數據庫.

Oracle安裝文件下有Database Configuration Assistant插件.

Database Configuration Assistant功能:
建立數據庫
配置數據庫選項
刪除數據庫
管理模板
配置自動存儲管理:ASM (Automatic Store Manage)

DBA:Database Administrator 數據庫管理員
(DBA職責) 數據庫管理任務:
1.評測數據庫服務器硬件.
2.安裝Oracle數據庫軟件.
3.規劃數據庫.
4.建立並打開數據庫.
5.數據庫備份.
6.註冊用戶.
7.實現數據庫計劃.
8.全庫備份、增量備份.
9.調整數據庫性能.

Database Configuration Assistant建立數據庫步驟:
1.從如下列表中選擇模板來建立數據庫
2.填寫數據庫全名稱和SID
3.使用Web版數據庫管理工具.
4.設置密碼.

Oracle初始化參數存儲於SPFILE邏輯文件.

Oracle閃回FLASHBACK:

閃回解決的問題:
1.錯誤的刪除了數據,而且COMMIT.
2.錯誤的刪除了表 DROP TABLE.
3.如何獲取表上的歷史記錄.
4.如何撤銷一個已經提交的事務.

閃回的類型:
1.閃回表(FLASHBACK TABLE):
    將表回退到過去的一個時間上.
2.閃回刪除(FLASHBACK DROP):
    操做Oracle的回收站.
3.閃回版本查詢(FLASHBACK VERSION QUERY):
    表上的歷史記錄.
4.閃回事務查詢(FLASHBACK TRANSACTION QUERY):
    獲取一個操做UNDO_SQL,而後經過UNDO_SQL來撤銷事務.
5.閃回數據庫:
    將數據庫回退到過去的一個時間上.
6.閃迴歸檔日誌:

閃回操做最初出如今Oracle 9i中,最初只有第一種類型,
在10g版本中才增長後幾個版本.

閃回的好處:
1.恢復中,閃回技術是革命性的進步.
2.傳統的恢復技術緩慢.
    它是整個數據庫或者一個文件的恢復,不僅是恢復損壞的數據.
    在數據庫日誌中每一個修改都必須被檢查.
3.閃回的速度快.
    經過行和事務把改變編入索引.
    僅僅改變的數據會被恢復.
4.閃回的命令很容易.
    沒有複雜棘手的多步程序.

閃回表(Flashback Table):

閃回表,其實是將表中的數據快速恢復到過去的一個焦點或者系統改變號SCN上,
實現表的閃回,須要設計到與撤銷表空間相關的UNDO信息,經過SHOW PARAMETER UNDO
命令能夠了解這些信息.

用戶對錶數據的修改操做,都記錄在撤銷表空間中,這爲表的閃回提供了數據恢復
的基礎,例如:某個修改操做在提交後被記錄在撤銷表空間中,保留時間爲900秒,
用戶能夠在這900秒的時間內對錶進行閃回操做,從而將表中的數據恢復到修改
以前的狀態.

執行表的閃回,須要有Flashback Any Table 權限.

*** 使用系統管理員查看UNDO信息,
    ALTER SYSTEM SET UNDO_RETENTION=1200 SCOPE=BOTH;
    SCOPE : MEMORY|SPFILE|BOTH
    -- 修改撤銷表空間的時間.

*** 系統改變號SCN -- 和Oracle系統時間相對應.
    SELECT TO_CHAR(SYSDATE,'yyyy-mm-dd hh24:mi:ss:mm') 時間,
           TIMESTAMP_TO_SON(SYSDATE) SCN
    FROM DUAL;

*** 開啓表的行移動功能:ALTER TABLE 表名 ENABLE ROW MOVEMENT;
    
閃回表(Flashback Table)語法格式:
FLASHBACK TABLE [schema.]表名
TO 
    [BEFORE DROP [RENAME TO 表名]] 
        BEFORE DROP ->表示恢復到刪除以前,
        RENAME TO 表名 ->表示更換表名.
    或[SCN 值]
        表示將表閃回到這個系統改變號對應的時間點上.
    或[TIMESTAMP 值]
        表示將表閃回到這個時間點上.
[[ENABLE|DISABLE] TRIGGER]
    ENABLE TRIGGER表示觸發器恢復之後爲enable狀態,
    默認則爲disable狀態.

問題:
    如何獲取離該操做最近的一段時間或SCN?

閃回表注意的問題:
    1.系統表不能被閃回.
    2.不能跨越DDL操做.
    3.會被寫入警告日誌.
    4.產生撤銷和重作的數據.

閃回刪除(Flashback Drop):

查看回收站:SHOW RECYCLEBIN;

清空回收站:PURGE RECYCLEBIN;

查看回收站中的表信息:
*** 使用RECYCLEBIN NAME 值做爲表使用.
SELECT * FROM "RECYCLEBIN NAME";

*** 回收站只對表使用.

*** 管理員沒有回收站.

執行閃回刪除:
FLASHBACK TABLE 原表名|"RECYCLEBIN NAME" 
TO BEFORE DROP [RENAME TO 新表名];

當回收站中有重複的表時?
    經過表名將表從回收站還原,回收站默認還原
最新刪除的表.

*** 當第二張同名表要還原的時候,須要從新命名錶名.

閃回表和閃回刪除小結:
1.閃回表:
    SHOW PARAMETERS UNDO ---> 900秒
    SCN 系統改變號.
    執行閃回表:
        行移動.
    系統表不能閃回(數據字典)
    不能跨越DDL操做.
    如何獲取離該操做最近的一個時間.
2.閃回刪除:
    Oracle回收站.
    管理員沒有回收站.
    執行閃回刪除.
        經過表名或"RECYCLEBIN NAME" 閃回.
    閃回同名的表.

閃回版本查詢(FLASHBACK VERSION QUERY):
    閃回版本查詢,提供了一個審計行改變的查詢
功能,經過它能夠查找到全部已經提交了的行記錄。

Flashback Version Query語法格式:
SELECT 
    字段列表
    [,VERSIONS_OPERATOR,
    VERSIONS_STARTTIME,
    VERSIONS_ENDTIME,
    VERSIONS_XID -- 事務號
    ]
FROM 表名
VERSION BETWEEN
[SCN|TIMESTAMP]
[express|MINVALUE]
AND
[express|MAXVALUE]
AS OF -- AS OF:表示恢復單個版本
[SCN|TIMESTAMP]
express;
-- BETWEEN ... AND ... :表示時間段.

FVQ->解決如何獲取最近操做的時間或SCN?

閃回事務查詢(Flashback Transaction Query):
    閃回事務查詢其實是閃回版本查詢的一個擴充,
經過它能夠審計某個事務甚至撤銷一個已經提交的事務.

實現閃回事務查詢,須要先了解FLASH_TRANSACTION_QUERY視圖,從該視圖中能夠獲取事務的歷史
操做記錄,以及撤銷語句(UNDO_SQL).

使用閃回事務查詢,能夠了解某個錶的歷史操做記錄對應的一個撤銷
SQL語句,若是想要撤銷這個操做,就能夠執行這個SQL語句.

Oracle的導入(import)導出(export):
    *** 輕量級的備份和還原.

*** RMAN(Recovery Manager) 數據的備份.

export導出:
exp -help; 能夠查看導出的數據文檔.

exp導出的三種方式:
1.表方式:將指定表的數據導出.
exp scott/tiger@localhost:1521/orcl 
file=d:/temp/a.dmp 
log=d:/temp a.log 
tables=emp,dept

2.用戶方式:將指定用戶的全部對象以及數據導出.
exp scott/tiger@localhost:1521/orcl 
file=d:/temp/a.dmp 
log=d:/temp a.log


3.全庫方式:將數據庫中的全部對象導入導出(管理員權限).
exp system/password@localhost:1521/orcl 
file=d:/temp/a.dmp 
log=d:/temp a.log
full=y

imp導入的三種方式:
1.表方式:將指定表的數據導入.
imp hr/hr@localhost:1521/orcl 
file=d:/temp/a.dmp
log=d:/temp impa.log
tables=emp,dept
fromuser=scott touser=hr
commit=y
ignore=y

2.將指定用戶的全部對象以及數據導入.
imp hr/hr@localhost:1521/orcl
file=d:/temp/a.dmp
log=d:/temp/ia.dmp
fromuser=scott touser=hr
commit=y
ignore=y

3.全庫方式:將數據庫中的全部對象導入(管理員權限).
imp system/password@1521/orcl 
file=d:/temp/a.dmp
log=d:/temp/ia.dmp
full=y
commit=y
destory=y

管理方案(schema):
EM管理器的使用.

什麼是方案?

11gOracle登陸(enterprise manager)EM:
路徑:
    https://localhost:1158/em/

登陸須要權限:SELECT_CATALOG_ROLE


*** 命令行切換用戶:
    CONN 用戶名/密碼 [AS SYSDBA(管理員)]

用戶管理安全:
用戶user:
    1.建立一個用戶:
        CREATE USER 用戶名 [PROFILE DEFAULT] 
        IDENTIFIED BY 密碼 [ACCOUNT UNLOCK]
        GRANT CONNECT TO 用戶名;
    2.刪除用戶:
        DROP USER 用戶名 [CASCADE(級聯)];
一個Oracle用戶具有:
    (1)一個惟一的用戶名.
    (2)一個驗證方法.
    (3)一個默認表空間.
    (4)一個臨時表空間.
    (5)一個用戶概要文件.
    (6)一個消費羣.
    (7)一個鎖狀態.
    (8)每一個表空間的配額.
    (9)權限和角色.

角色role:
    建立角色:
        CREATE ROLE 角色名稱;
    賦予角色權限:
        GRANT ... TO 角色名稱;

權限privilege:
    用戶權限分類:
        (1)系統權限system:
        (2)對象權限object:

概要文件profile:

Oracle用戶的認證方式:
1.password密碼認證.
2.External外部認證(或主機認證),當前用戶必須是管理員administrator.
    外部認證方式優先於密碼認證方式.
    sqlplus / [as sysdba];
3.global全局認證方式(例如:生物認證方式(指紋,眼膜),token認證方式):

*** windows系統打開本地用戶和組:lusrmgr.msc

*** Oracle預約義用戶:
    SYS(數據庫擁有者):
        擁有DBA權限.
        擁有ADMIN OPTION的全部權限.
        擁有startup,shutdown,以及若干維護ml.
        擁有數據字典.
    SYSTEM用戶:
        擁有DBA權限.
    *** 這些用戶並不是用於常規操做.
        
*** 用戶解鎖:ALTER USER 用戶名 ACCOUNT UNLOCK;

*** 用戶修改密碼:ALTER USER 用戶名 IDENTIFIED BY 新密碼;

*** 使用ADMIN OPTION 撤銷系統權限(system privilege):
 GRANT CREATE TABLE TO 用戶名 WITH ADMIN OPTION;
 
 REVOKE CREATE TABLE TO 用戶名;-- 不會產生級聯撤銷.

*** 使用grant option 撤銷對象權限:
    撤銷時會產生級聯效果.
 
*** 用戶建立表條件:
    (1)有CREATE TABLE權限.
    (2)有表空間.
        給用戶分配表空間:
            ALTER USER 用戶名 QUOTA UNLIMITED ON USERS;

*** 經常使用於建立一個普通用戶語句:
CREATE USER 用戶名 [PROFILE DEFAULT] 
IDENTIFIED BY 密碼 [ACCOUNT UNLOCK];
GRANT CONNECT,RESOURCE TO 用戶名;

概要文件profile:
1.指定密碼規則.
2.控制資源消費.

Oracle分佈式數據庫:
數據在物理上被存放在多個節點上,可是邏輯上是一個總體.

分佈式數據庫的獨立性:
    分佈式數據的獨立性是指用戶不關心數據是如何分割和
    存儲,只需它關心須要什麼數據.

數據庫鏈路:DBLINK
    數據庫鏈路是單向的.
    跨節點的數據建立及查詢.
    跨節點的數據更新.
定義數據庫鏈路:
CREATE DATABASE LINK 所須要鏈接數據庫的真實名稱SID
CONNECT TO 所須要鏈接數據庫的用戶名
INDENTIFIED BY 所須要鏈接數據庫的密碼 
USING [所須要鏈接數據庫的服務命名];

*** Oracle數據庫程序安裝包下:
    啓動Oracle Net Manager 建立服務命名.
    
*** 建立數據庫鏈路須要:CREATE DATABASE 權限.

分佈式數據庫的查詢:
SELECT ENAME,DNAME
FROM DEPT,EMP@所須要鏈接數據庫的真實名稱SID
WHERE EMP.DEPTNO=DEPT.DEPTNO;

使用同義詞給遠端的數據庫建立別名:
CREATE SYNONYM 同義詞名稱 FOR EMP@所須要鏈接數據庫的真實名稱SID;

分佈式數據庫的插入:
INSERT INTO EMP SELECT * FROM EMP@SID;

數據的複製:
CREATE TABLE EMP AS SELECT * FROM EMP@SID;

分佈式數據庫跨節點更新:
快照:
    定義快照維護關係表的異步副本,
    指在主表修改後的指定時間內刷新副本,
    用於主表修改少,但查詢頻繁的表.
    
    CREATE SNAPSHOT 表名 
    REFRESH START WITH SYSDATE
    NEXT NEXT_DAY(SYSDATE,'MONDAY')
    AS SELECT * FROM EMP@SID;
觸發器:
    利用觸發器實現數據的同步.

CREATE [OR REPLACE] TRIGGER 觸發器名稱 BEFORE|AFTER INSERT|UPDATE|DELETE [OF 字段列表] ON 表名 [FOR EACH ROW [WHEN(條件)]] DECLARE     -- 聲明變量. BEGIN     -- 實現邏輯語句. EXCEPTION     -- 例外處理語句. END; /

相關文章
相關標籤/搜索