oracle數據庫復習總結


1.簡述Oracle數據庫的啟動命令STARTUP NOMOUNT,STARTUP MOUNT,STARTUP的作用。

a、STARTUP NOMOUNT 創建實例不加載數據庫

創建實例,並不加載數據庫,Oracle僅為實例創建各種內存結構和后台進程,不會打開任何數據文件。
在NoMount狀態下,只能訪問那些與SGA區相關的數據字典視圖,視圖中的信息都是從SGA區中獲取的,與數據庫無關

模式用途:
創建新數據庫
重建控制文件

b、STARTUP MOUNT 加載數據庫但不打開數據庫

(需要控制文件)為實例加載數據庫,但保持數據庫為關閉狀態
數據文件和重做日志文件都無法進行讀寫,用戶無法對數據庫進行操作
在Mount狀態下,只能訪問那些與控制文件相關的數據字典視圖,這些視圖都是從控制文件中獲取的。

模式用途:
重命名數據文件;
添加、刪除或重命名重做日志文件;
執行數據庫完全恢復操作;
改變數據庫的歸檔模式

c、STARTUP 正常打開數據庫

正常按照3個步驟打開數據庫

模式用途:平時不對數據庫做什么維護,比如應用開發類任務


2.簡述Oracle數據庫的關閉命令SHUTDOWN IMMEDIATE, SHUTDOWN TRANSACTIONAL的作用。

a、SHUTDOWN NORMAL 正常關閉方式
阻止任何用戶建立新的連接;
等待當前所有正在連接的用戶主動斷開連接(此方式下Oracle不會立即斷掉當前用戶的連接,這些用戶仍然可進行相關的操作)
一旦所有的用戶都斷開連接,則立即關閉、卸載數據庫,並終止實例。(所以,一般以正常方式關閉數據庫時,應該通知所有在線的用戶盡快斷開連接)

b、SHUTDOWN IMMEDIATE 立即關閉方式

執行過程

阻止任何用戶建立新的連接,同時阻止當前連接的用戶開始新事務

Oracle不等待在線用戶主動斷開連接,強制終止用戶的當前事務,將任何未提交的事務回退。

直接關閉、卸載數據庫,並終止實例。

c、SHUTDOWN TRANSACTIONAL 事物關閉方式

這種方式介於正常關閉方式跟立即關閉方式之間

執行過程

阻止任何用戶建立新的連接,同時阻止當前連接的用戶開始新的事務。
等待所有未提交的活動事務提交完畢,然后立即斷開用戶的連接。
直接關閉、卸載數據庫,並終止實例。

3.概述Oracle數據庫的物理存儲結構。

p22

物理存儲結構是指構成數據庫的操作系統文件的組織結構,物理儲結構用於描述在數據庫系統外部如何組織和管理數據,與具體的操作系統有關。

物理存儲系統由數據文件、控制文件和重做日志文件組成。
a、數據文件
包含數據庫中真正的數據。數據文件與表空間關系:一個表空間在物理上對應一個或多個數據文件,而一個數據文件只能屬於一個表空間。


b、控制文件
一個很小的二進制文件,用於記錄數據庫的物理結構,包含維護和校驗數據庫一致性所需的信息。


c、重做日志文件
包含當系統崩潰后進行恢復時所需記錄的變化信息。

4.簡述Oracle數據庫的邏輯存儲結構。

p26

邏輯存儲結構用於描述在數據庫系統內部如何組織和管理數據,與操作系統無關。
邏輯存儲結構從大到小依次為表空間、段、區和數據塊。

它們之間的關系:一個表空間由多個段組成,一個段由多個區組成,一個區又多個數據塊組成。

a、表空間  table space

Oracle中最大的邏輯存儲結構,與物理上的數據文件相對應,一個Oracle數據庫至少有一個表空間,一個表空間可以對應多個數據文件,但一個數據文件只能對應一個表空間。

表空間的大小等於構成該表空間的所有數據文件大小之和。

b、段 segment

段是由一組區間組成,用於存儲具有獨立存儲結構對象的全部數據。

一個段只屬於一個特定的數據庫對象。

主要有數據段、索引段、臨時段、LOB段和回退段。

c、區 Extent

Oracle存儲分配的最小單位,由連續數據塊組成。

d、數據塊 Block

數據塊是Oracle 管理數據文件中存儲空間的最基本單位,也是最小的邏輯存儲單位。

Oracle數據庫以數據塊為單位進行邏輯讀寫操作,一旦數據庫創建之后,將無法再修改數據塊的大小。


5.簡要介紹模式與用戶之間的關系。

p295

用戶是數據庫對象之一,只有使用了合法的用戶登錄之后,才能對數據庫進行訪問和操作。用戶可以直接操作表、索引和視圖等對象。

但在Oracle中,有些邏輯結構是數據庫用戶不能直接進行操作的對象,需要用過模式來組織和管理這些數據庫對象。

模式是數據庫對象集合,用戶和模式是一一對應的關系,並且二者名稱相同。

每個用戶都擁有唯一的模式,用戶創建的所有對象都保存在自己的模式中。

在同一個模式中不能存在同名對象,但在不同模式可以具有相同對象名。

用戶可以直接訪問其模式對象,但是要訪問其他模式對象必須具有相應的權限。

模式是用戶的附屬對象,它是依賴對象的存在而存在的。


6.列舉出ORACLE數據庫管理系統中常見的實例進程(4個),並簡要說明其用途。

P32

(1)數據庫寫入進程(DBWn Database Writer)

將緩沖區的數據寫入數據文件,負責緩沖區存儲區管理。

(2)日志寫入進程(LGWR Log Writer)

它將日志文件緩沖區中的日志數據寫入磁盤的日志文件,負責管理日志緩沖區的后台進程

(3)系統監控進程(SMON System Monitor)

當數據庫實例出現故障或者系統崩潰時,執行恢復操作

(4)進程監控進程(PMON Process Monitor)

當用戶進程出現故障時執行恢復的操作,負責清理內存存儲區和釋放該進程所使用的資源。

7.簡述Oracle數據庫的兩級日志結構。

通過重做日志組和引入歸檔日志 (兩級日志結構),Oracle在數 據庫系統的效率可恢復性之間 進行了巧妙的折中, 這是Oracle的得意之作

重做日志

P126

重做日志文件用於記載事務操作所引起的數據庫變換

Oracle 通過重做日志來實現快速提交

  • 重做日志可以連續、順序的快速寫出
  • 重做日志記錄的精簡內容

重做日志文件是由重做記錄組成的,重做記錄由一組改變向量(Change Vector)組成

使用重做記錄不僅能夠恢復對數據文件所做的修改操作,還能夠恢復對回滾段所做的修改操作

歸檔日志

Oracle數據庫有兩種日志模式:

  • 非歸檔日志模式(NOARCHIVELOG)   

如果發生日志切換,則日志文件中原有內容將被新的內容覆蓋

  • 歸檔日志模式(ARCHIVELOG)

如果發生日志切換,則Oracle系統會將日志文件歸檔,然后才允許向文件中寫入新的日志內容

 

歸檔日志是非活動的重做日志備份。通過使用歸檔日志,可以保留所有重做歷史記錄
當數據庫處於ARCHIVELOG模式並進行日志切換時,后台進程ARCn會將已經寫滿的重做日志的內容保存到歸檔日志中,這個過程叫做歸檔
當數據庫出現介質故障時,使用數據文件備份、歸檔日志和重做日志可以完全恢復數據庫

 

8.簡述過程和函數的區別。

P246

過程指的是在大型數據庫系統中專門定義的一組SQL語句集,它可以定義用戶操作參數,並且存在於數據庫中,當使用時直接調用即可。
函數也是一種較為方便的存儲結構,用戶定義的函數可以被SQL語句或PL/SQL程序直接調用。

函數與過程的區別:

存儲過程沒有返回值,不能由SQL語句直接使用,只能通過EXECUT命令或PL/SQL程序塊內部調用,依靠OUT或IN OUT返回數據。
函數必須有返回值,並且可以作為一個表達式的一部分,函數不能作為一個完整的語句使用,函數返回值的數據類型在創建函數時定義。

 

9.簡述oracle數據庫觸發器的類型。

DDL(Data Definition Language)數據定義語言
DML(Data Manipulation Language)數據操縱語言

P252

Oracle中的觸發器主要有DML觸發器、INSTEAD OF觸發器、數據庫事件觸發器及DDL觸發器幾種類型

a、DML觸發器

指DML語句觸發的觸發器,DML所包含的觸發事件有INSERT、UPDATE和DELETE。

b、INSTEAD OF觸發器

代替數據庫視圖上的DML操作,使用INSTEAD OF觸發器不但可以通過使用視圖簡化代碼,還允許根據需要發生各種不同的操作。

c、數據庫事件觸發器

定義在整個數據庫或模式上,觸發事件是數據庫事件。支持的觸發事件有LOGON、LOGOFF、SERVERERROR、STARTUP和SHUTDOWN。

d、DDL觸發器

指DDL語句(CREATE、ALTER和DROP等)觸發的觸發器。


10.簡述段的類型。

P28

根據段中所存儲數據的特征,可分為5中類型:
a、數據段

用於存儲表中的所有數據,一個表對應一個段

b、索引段

用於存儲表中索引的所有數據。

c、臨時段

用於存儲排序或匯總時產生的臨時數據。

d、LOB段

用於存儲表中的大型數據對象

e、回退段

用於存儲用戶數據被修改之前的位置和值。利用回退段的信息,可以回退未提交的事務,維護數據庫的讀一致性,並能從實例的崩潰中進行恢復。每個數據庫都應該至少擁有一個回退段,供數據恢復時使用。

11.簡述顯式游標的使用過程。

PPT 0970

第1步:聲明游標(CURSOR 定義)
第2步:為查詢打開游標(OPEN 游標名稱)。使用OPEN操作,當游標打開時首先會檢查綁定此游標的變量內容,之后再確定所使用的查詢結果集,最后游標將指針指向結果集的第1行。如果用戶定義的是一個帶有參數的游標,則會在打開游標時為游標設置指定的參數值
第3步:取得結果放入PL/SQL變量中(FETCH 游標名稱 INTO ROWTYPE變量),使用循環和 FETCH…INTO操作
第4步:關閉游標(CLOSE 游標名稱)

12.簡述游標的屬性(4個)。

P226

(1)使用%ISOPEN

主要用於判斷游標是否打開。

(2)使用%FOUND

用於判斷游標是和否找到記錄,如果找到記錄,用FETCH語句提取游標數據,否則關閉游標

(3)使用%NOTFOUND

與%FOUND屬性恰好相反,如果檢索到數據,則返回FALSE,如沒有檢測到數據則返回TRUE

(4)使用%ROWCOUNT

用於返回當前已經檢索到的實際行數。

13.簡述調用過程時傳遞參數值的三種方式。

P241

(1)創建帶有IN參數的過程

IN是指輸入參數,由存儲過程的調用者為其賦值。若不指定參數名,系統自動按照存儲過程中參數的先后順序為參數賦值;若指定參數名,實現指定參數的賦值。

(2)創建帶有OUT參數的過程

OUT參數是指輸出參數,由存儲過程中的語句為其賦值,並返回給用戶,使用這種模式的參數,必須在參數的后面添加OUT關鍵字。

(2)創建帶有IN OUT參數的過程

IN OUT參數同時擁有IN 與 OUT 參數的特性,既接受用戶的傳值,又允許在過程中修改其值,並可以將值返回,使用這種模式的參數,需要在參數后面添加IN OUT關鍵字。

14.簡要介紹oracle數據表的各類約束及作用。

P103

根據約束的作用域可以將約束分為:

表級別約束:定義在一個表中,可以用於表中的多個列

列級別約束:對表中的一列進行約束,只能夠應用於一個列

根據約束的用途可以將約束分為:

a、NOT NULL約束(非空約束):

指定一列不允許存儲空值,限制必須為某一列提供值

b、PRIMARY KEY約束(主鍵約束):

指定表的主鍵,主鍵由一列或多列組成,唯一標識表的一行

c、UNIQUE(唯一約束):

指定一列或一組列只能存儲唯一的值

d、CHECK約束(檢查約束):

指定一列或一組列的值必須滿足某種條件

f、FOREIGN KEY約束(外鍵約束):

指定表的外鍵,外鍵引用另一表中的一列,在自引用的情況中,則引用本表的一列

 
操作

SQL查詢

 

SQL語句各子句的執行順序
第一步:執行FROM子句,確定要檢索的數據來源
第二步:執行WHERE子句,使用限定符對數據行進行過濾
第三步:執行GROUP BY子句,根據指定字段進行分組
第四步:執行HAVING子句,對分組后的統計數據進行過濾
第五步:執行SELECT子句,確定要檢索出的數據列
第六步:執行ORDER BY子句排序
ORDER BY子句可以使用SELECT子句定義的別名

練習題

簡單查詢練習

1、找出EMP表中的姓名(ENAME)第三個字母是A 的員工姓名

SELECT ename
FROM emp
WHERE ename LIKE '--A%'

2、找出EMP表員工名字中含有A 和N的員工姓名

SELECT ename
FROM emp
WHERE ename LIKE%A%'
AND ename LIKE ‘%N%'

3、列出部門編號為20的所有職位

SELECT DISTINCT job
FROM emp
WHERE deptno = 20;

4、列出不屬於SALES 的部門

SELECT DISTINCT *
FROM dept
WHERE dname <> 'SALES';

5、找出所有有佣金的員工,列出姓名、工資、佣金,顯示結果按工資從小到大,佣金從大到小

SELECT ename,sal,comm
FROM emp
WHERE comm > 0
ORDER BY sal , comm DESC;

6、列出工資不在1000 到1500 之間的員工信息: 名字、工資, 按工資從大到小排序

SELECT ename,sal
FROM emp
WHERE sal NOT BETWEEN 1000 AND 1500
ORDER BY sal DESC;

7、顯示職位為MANAGER 和 SALESMAN,年薪在15000 和20000 之間的員工的信息 :名字、職位、年薪

SELECT ename , job , (sal+comm)×12  "Annual Salary" 
FROM emp
WHERE (sal+comm)×12 BETWEEN 15000 AND 20000
AND job in ('MANAGER''SALESMAN');

統計查詢示例

1、顯示非銷售人員工作名稱以及從事同一工作雇員的月工資的總和,並且要滿足從事同一工作的雇員的月工資合計大於5000元,輸出結果按月工資的合集升序排列

SELECT job,sum(sal) sum
FROM emp
WHERE job<>'SALESMAN'
GROUP BY job
HAVING sum(sal)>5000
ORDER BY sum ASC;

2、(多表查詢)
查詢部門的詳細信息:編號、名稱、位置、部門人數、平均工資、總工資、最高工資、最低工資

SELECT d.deptno,d.dname,d.loc,count(e.empno) count,  nvl(avg(sal),0) avg,
nvl(
sum(sal),0) sum, nvl(max(sal),0) max, nvl(min(sal),0) min FROM dept d,emp e WHERE d.deptno = e.deptno(+) GROUP BY d.deptno,d.dname,d.loc;

嵌入視圖,多表查詢

SELECT d.deptno,d.dname,d.loc,  nvl(count,0) count, nvl(avg,0) avg, 
        nvl(sum,0) sum, nvl(max,0) max, nvl(min,0) min
FROM dept d, 
    (SELECT deptno,count(empno) count, avg(sal) avg,
        sum(sal) sum,  max(sal) max,  min(sal) min
      FROM  emp
      GROUP BY deptno) e
WHERE d.deptno = e.deptno(+);

子查詢

1、查出與ALLEN從事同一工作,並且基本工資高於雇員編號為7521的全部雇員姓名、工作、基本工資

SELECT ename, job,sal
FROM emp
WHERE job = (SELECT job FROM emp WHERE ename='ALLEN')
    AND sal > ( SELECT sal FROM emp WHERE empno=7521);

2、查詢所有在部門SALES工作的員工的編號、姓名、基本工資、獎金、職位、雇佣日期、部門的最高和最低工資

SELECT e.empno,e.ename,e.sal,e.comm,e.job,e.hiredate,es.max,es.min
FROM emp e, (
    SELECT deptno, max(sal) max, min(sal) min
    FROM emp
    GROUP BY deptno ) es
WHERE e.deptno = (
    SELECT deptno 
    FROM dept 
    WHERE dname='SALES')
  AND e.deptno=es.deptno;

3、查詢薪金比ALLEN或CLARK多的所有員工的編號、姓名、基本工資、部門名稱、其領導姓名、部門人數

SELECT e.empno,e.ename,e.sal, d.dname, m.ename, c.count
FROM emp e, emp m, dept d, (
    SELECT deptno,count(empno) count
    FROM emp
    GROUP BY deptno) c
WHERE e.sal>ANY(
    SELECT sal
    FROM emp
    WHERE ename IN('ALLEN','CLARK'))
  AND e.ename NOT IN('ALLEN','CLARK')
  AND e.mgr=m.empno(+)
  AND e.deptno=d.deptno
  AND e.deptno=c.deptno;

4、查詢所有薪金高於公司平均薪金的員工編號、姓名、基本工資、職位、雇佣日期、所在部門名稱、位置、上級領導姓名,公司的工資等級,部門人數、平均工資、平均服務年限

SELECT e.empno,e.ename,e.sal,e.job,e.hiredate,
    d.dname,em.ename bossname,s.grade,es.count,es.avg,es.avgyear
FROM emp e,emp em,dept d,salgrade s,(
    SELECT deptno,count(empno) count,round(avg(sal),2) avg,
        round(avg(months_between(sysdate,hiredate)/12),2) avgyear
    FROM emp
    GROUP BY deptno) es
WHERE e.sal > (
    SELECT avg(sal) FROM emp)
  AND e.mgr=em.empno(+)
  AND e.deptno=d.deptno
  AND e.sal BETWEEN s.losal AND s.hisal
  AND e.deptno=es.deptno;

復雜查詢練習

1、列出至少有一個員工的所有部門

方法一

SELECT dname 
FROM emp e , dept d
WHERE e.deptno =d.deptno
GROUP BY dname

 方法二

SELECT dname 
FROM dept d
WHERE 0 <(
SELECT cout(*) 
FROM emp
WHERE deptno = d.deptno 
);

2、列出薪金比“SMITH”多的所有員工

方法一

SELECT e.empno , e.ename , e.job , e.mgr , e.hiredate , e.sal , e.comm , e.deptno
FROM emp e ,emp e1
WHERE e.sal > e1.sal AND e1.ename = 'SMITH'

方法二

SELECT empno , ename , job , mgr , hiredate , sal , comm , deptno
FROM emp 
WHERE sal > {
SELECT sal 
FROM emp
WHERE ename = 'SMITH'
};

3、列出所有員工的姓名及其直接上級的姓名
方法一

SELECT e.ename  name, e1.ename "BOSS NAME"
FROM emp e , emp e1
WHERE e.mgr = e1.empno;

方法二

SELECT e.ename  name, 
(SELECT ename FROM emp
WHERE empno = e.mgr)  "BOSS NAME"
FROM emp e;

4、列出受雇日期早於其直接上級的所有員工

SELECT e.ename  name, 
FROM emp e
WHERE e.hiredate <(
SELECT hiredate
FROM emp
WHERE empno = e.mgr);

5、列出部門名稱和這些部門的員工信息,同時列出那些沒有員工的部門

SELECT dname, e.empno ,e.name, e.job ,e.mgr , e.hiredate,e.sal
FROM dept d LEFT OUTER JOIN emp e USING(deptno);
//左連接

 

6、列出所有 “CLERK”  (辦事員) 的姓名及其部門名稱

SELECT ename , dname
FROM emp e NATURAL JOIN dept d
WHERE job = 'CLERK' ;
//自然連接

7、列出最低薪金大於1500的各種工作

方法一

SELECT DISTINCT job
FROM emp
GROUP BY job
HAVING 1500 < min(sal) ;

方法二

SELECT DISTINCT e.job
FROM emp e
WHERE 1500 < (
SELECT min(sal)
FROM emp
WHERE job = e.job
);

8、列出在部門 “SALES” (銷售部) 工作的員工的姓名,假定不知道銷售部的部門編號

SELECT ename
FROM emp e , dept d
WHERE e.deptno = d.deptno
AND d.name = ‘SALES’;

9、列出薪金高於公司平均薪金的所有員工

SELECT ename , sal
FROM emp 
WHERE sal >(
SELECT avg(sal)
FROM emp );

10、列出與  “SCOTT” 從事相同工作的所有員工

SELECT ename , job
FROM emp 
WHERE  job=(
SELECT job
FROM emp
WHERE ename = 'SCOTT' )
AND ename <>'SCOTT';

11、列出薪金等於部門30中員工的薪金的所有員工的姓名和薪金

SELECT ename , sal
FROM
emp WHERE deptno<>30 AND sal IN ( SELECT sal FROM emp WHERE deptno = 30 );

12、列出薪金高於在部門30工作的所有員工的 薪金的員工姓名和薪金

SELECT ename , sal
FROM emp
WHERE sal >(
SELECT max(sal)
FROM emp
WHERE deptno = 30);

 

14、列出所有員工的姓名、部門名稱 和工資

SELECT e.ename , d.dname, e.sal + nvl(e.comm,0) wage
FROM emp e , dept d
WHERE e.deptno = d.deptno;

15、列出各個部門的MANAGER 的最低薪金

SELECT deptno , min(sal) lowestsal
FROM emp
WHERE job = 'MANAGER'
GROUP BY deptno ;

16、列出各種工作的最低工資

SELECT job , min(sal) lowestsal
FROM emp
GROUP BY job ;

17、列出所有員工的年工資,按年薪從低到高排序

SELECT empno , ename ,(sal + nvl(comm,012 yearincome)
FROM emp
ORDER BY yearincome ;

CASE表達式

P218

顯示每個雇員的姓名、工資、職位 同時顯示新的工資: 新工資的標准為 業務員增長10% 銷售人員增長20% 經理增長30% 其他職位的人增長50%

SELECT ename,sal,
    CASE job WHEN 'CLERK‘       
THEN sal*1.1 WHEN
'SALESMAN'
THEN sal*1.2 WHEN
'MANAGER‘
THEN sal*1.3 ELSE
sal*1.5 END new_sal

用戶概要文件創建

應用實例

創建概要文件  tiger_prof

CREATE PROFILE tiger_prof LIMIT
FAILED_LOGIN_ATTEMPTS 4
PASSWORD_LOCK_TIME UNLIMITED
PASSWORD_LIFE_TIME 91
PASSWROD_GRACE_TIME 7
PASSWORD_REUSE_TIME 28
PASSWORD_REUSE_MAX 3
SESSIONS_PER_USER 3
CPU_PER_SESSION 16800
LOGICAL_READS_PER_SESSION 23688
CONNECT_TIME 180
IDLE_TIME 28;

為防止通過猜測攻破口令防線,用戶登錄系統時最多嘗試 4 次

4 次之后該用戶的賬戶將被永遠鎖住,只有數據庫管理員才能打開
為防止口令使用時間過長而泄密,設定口令有效期為 91 FAILED_LOGIN_ATTEMPTS 4天,之后必須修改口令

FAILED_LOGIN_ATTEMPTS 4
PASSWORD_LOCK_TIME UNLIMITED
PASSWORD_LIFE_TIME 91


當一個口令失效后系統給用戶 7 天的寬免期,如果在這段時間內用戶沒有改變口令,將無法再登錄系統

PASSWROD_GRACE_TIME 7


為防止用戶所選的新口令與舊口令相同而變得不安全,一個口令失效后至少28天並且3次修改口令后才能重用

PASSWORD_REUSE_TIME 28

PASSWORD_REUSE_MAX 3


為減少數據庫的連接總數,每個用戶最多可以同時開啟 3 個會話

SESSIONS_PER_USER 3


為防止一個用戶會話消耗過多處理器時間(也是限制黑客利用破譯用戶口令后,以合法用戶登錄系統進行破壞的規模),每個會話所使用的處理器時間不能超過 16800 個 1% 秒(168秒)

CPU_PER_SESSION 16800


為防止用戶由於建立錯誤的查詢(如笛卡爾乘積)而產生大量的 I/O (也是限制黑客利用破譯用戶口令后,以合法用戶登錄系統進行破壞的規模),每個會話最多的邏輯閱讀量為 23688 個數據塊

LOGICAL_READS_PER_SESSION 23688


為防止用戶長期掛在數據庫系統上,每個用戶連接時間最多為 180 分鍾(3個小時)

CONNECT_TIME 180


為防止掛在數據庫系統上的用戶長時間不干活,每個用戶的空閑時間為 28 分鍾,如果一個用戶不干活的時間超過了 28 分鍾,Oracle系統會自動將這個用戶踢出系統並回滾該用戶所有沒有提交的事務

IDLE_TIME 28;

表空間管理

創建表空間、增加/刪除數據文件、移動數據文件等 14分

永久表空間的創建

P68

CREATE TABLESPACE tablespace1
DATAFILE 'f:\myoracle\tablespace1-1.dbf' SIZE 20M
AUTOEXTEND ON NEXT 10M MAXSIZE UMLIMITED

 autoextend on next 10m maxsize unlimited

指定了允許自動擴展,每次擴展大小為10MB

 

CREATE TABLESPACE tablespace2
DATAFILE 'f:\myoracle\tablespace2-1.dbf' SIZE 20M
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 800K

 extent management local uniform size 800k

本地化管理表空間

 

CREATE TABLESPACE tablespace3
DATAFILE 'f:\myoracle\tablespace3-1.dbf' SIZE 10M
SEGMENT SPACE MANAGEMENT MANUAL

 使用手動方式管理段的表空間

sgement space manegement manual

增加/刪除數據文件

PPT 04-39

P70

追加新的數據文件到表空間

ALTER TABLESPACE tbsname ADD DATAFILE filename SIZE size;

舉例

ALTER TABLESPACE tablespace01 
ADD DATAFILE 'F:\Oracle11g\tablespace0101.dbf' SIZE 10M;

刪除表空間中無數據的數據文件

ALTER TABLESPACE tbsname DROP DATAFILE filename;

移動數據文件

PPT 04-43

1、

ALTER TABLESAPCE tbsname RENAME DATAFILE filename1 TO filename2;

適用於上面沒有活動的撤銷數據或臨時段的非系統表空間中的數據文件
要求表空間為脫機狀態且目標數據文件必須存在
該語句只修改控制文件中指向數據文件的地址
重命名(移動)表空間中數據文件的步驟(數據庫為OPEN狀態)

  • 使用數據字典獲取表空間和數據文件的相關信息
  • 將表空間置為OFFLINE
  • 使用操作系統命令重命名數據文件或移動數據文件
  • 執行ALTER TABLESPACE RENAME DATAFILE命令
  • 將表空間置為ONLINE
  • 使用數據字典獲取表空間和數據文件的相關信息
  • 如果需要,使用操作系統命令刪除無用的數據文件

2、

ALTER DATABASE dbname RENAME FILE filename1 TO filename2;


適用於系統表空間和不能置為脫機的表空間中的數據文件
要求數據庫必須允許在MOUNT狀態且目標數據文件必須存在
該語句只修改控制文件中指向數據文件的地址
重命名(移動)表空間中數據文件的步驟

  • 如果數據庫是開啟的,使用數據字典獲取表空間和數據文件的相關信息
  • 關閉數據庫
  • 使用操作系統命令重命名數據文件或移動數據文件
  • 將數據庫置為MOUNT狀態
  • 執行ALTER DATABASE RENAME FILE命令
  • 打開數據庫
  • 使用數據字典獲取表空間和數據文件的相關信息
  • 如果需要,使用操作系統命令刪除無用的數據文件

 

PL/SQL編程

編寫匿名塊/函數/過程/觸發器完成指定功能 3題20分

匿名塊

P206

 

CASE 語句

根據輸入的員工號,修改該員工工資。如果該員工工資低於1000,則工資增加200;如果工資在1000~2000之間,則增加150;如果工資在2000~3000之間,則增加100;否則增加50。

DECLARE
    v_sal employees.salary%type;
    v_increment NUMBER(4);
    v_empno  employees.employee_id%type;
BEGIN
    v_empno:=&x;
    SELECT salary INTO v_sal FROM employees
        WHERE employee_id=v_empno;
    CASE   
        WHEN v_sal<1000 THEN v_increment:=200;
        WHEN v_sal<2000 THEN v_increment:=150;
        WHEN v_sal<3000 THEN v_increment:=100;
        ELSE  v_increment:=50;
    END CASE;
    UPDATE employees SET salary=salary+v_increment
        WHERE employee_id=v_empno;
END; 

求1~100之間偶數的和

簡單循環

 

WHILE循環

FOR循環

過程

 過程指的是在大型數據庫系統中專門定義的一組SQL語句集,它可以定義用戶操作參數,並且存在於數據庫中,當使用時直接調用即可
過程(存儲過程)= 過程的聲明 + PL/SQL塊

CREATE [OR REPLACE] PROCEDURE 過程名稱([參數名稱 [參數模式] NOCOPY 數據類型 [, 參數名稱 [參數模式] NOCOPY 數據類型, …]])
    [AUTHID [DEFINER | CURRENT_USER]]
AS | IS
    [PRAGMA AUTONOMOUS_TRANSACTION;]
    聲明部分;
BEGIN
    程序部分;
EXCEPTION
    異常處理;
END;

 

 

 

函數

 函數也是一種較為方便的存儲結構,用戶定義的函數可以被SQL語句或PL/SQL程序直接調用,實際上函數與過程最大的區別就在於,函數是可以有返回值的,而過程只能依靠OUT或IN OUT返回數據

CREATE [OR REPLACE] FUNCTION 函數名([參數, [參數, …]])
RETURN 返回值類型
[AUTHID {DEFINE | CURRENT_USER}]
AS | IS
    [PRAGMA AUTONOMOUS_TRANSACTION;]
    聲明部分;
BEGIN
    程序部分;
    [RETURN 返回值;]
[EXCEPTION
    異常處理]
END [函數名];

 

 

觸發器

CREATE [OR REPLACE] TRIGGER 觸發器名稱
[BEFORE | AFTER]  ---觸發時間
[INSTEAD OF]
[INSERT | UPDATE | UPDATE OF 列名稱 [, 列名稱, …] | DELETE] ---觸發事件
ON [表名稱 | 視圖 | DATABASE | SCHEMA] ---觸發對象
[REFERENCING [OLD AS 標記] [NEW AS 標記] [PARENT AS 標記]]
[FOR EACH ROW] ---觸發頻率
[FOLLOWS 觸發器名稱]
[DISABLE]
[WHEN 觸發條件] ---觸發條件
[DECLARE] ---觸發操作(程序主體)
    [程序聲明部分;]
    [PRAGMA AUTONOMOUS_TRANSACTION;]
BEGIN
    程序代碼部分;
END [觸發器名稱];

 

 

 

 

 

 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM