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,0)×12 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 [觸發器名稱];



