Oracle復習(知識點、練習題、實驗)

文章目錄

    • 第一章 數據庫概念
      • 數據庫的三級模式結構:模式、外模式、內模式
      • 三級模式之間的映射
    • 第二章 Oracle12g體系結構
      • Oracle的邏輯存儲結構
      • Oracle物理存儲結構
      • Oracle11g服務器結構
        • 系統全局區(SGA)
        • 程序全局區(PGA)
    • 第三章 Oracle數據庫的安裝與配置
    • 第四章 SQLPLUS命令
    • 第五章 SQL語言基礎及調優
      • 為列指定別名
      • 比較篩選
      • 使用特殊關鍵字篩選
      • in關鍵字
      • Between 關鍵字
      • 分組查詢
      • 多表關聯查詢
      • 內連接
      • 左外連接
      • 右外連接
      • 自然連接
      • 自身連接
      • 常用函數
      • 子查詢
        • 多行子查詢
      • 使用 ANY查詢
      • 使用ALL查詢
      • 關聯子查詢
    • 第六章 PL/SQL編程
      • PL/SQL游標
    • SqlPlus column命令用法
    • 觸發器例題
    • 選擇題
    • 填空題
    • 判斷題
    • 簡答題
    • 設計題
    • 實驗一
    • 實驗二
    • 實驗三

第一章 數據庫概念

(1)數據模型通常由數據結構、數據操作和完整性約束3部分組成的
(2)常見的數據模型
層次模型、網狀模型和關系模型

1)層次模型:用樹型結構表示實體類型及實體間聯系的數據模型為層次模型
2)網狀模型:用有向圖結構表示實體類型及實體間聯系的數據模型稱為網狀模型
3)關系模型:用二維表描述數據。

關系模型的基本術語:

關系:一個二維表就是一個關系
元組:二維表中的一行,即表中的記錄。
屬性: 二維表中的一列,用類型和值表示
域:每個屬性取值的變化范圍

關系模型的完整性規則是對關系的某種約束條件。

實體完整性約束
參照完整性約束:關系之間的基本約束。
用戶自定義的完整性約束

數據庫系統由以下部分的構成:
(1)數據庫
(2)數據庫管理系統
(3)應用系統
(4)數據庫管理員
(5)用戶

關系操作包括查詢操作和更新操作:
查詢操作:
選擇、投影、連接、除、并、交、差
更新操作:
增加、刪除、修改

命令:
1、連接命令

conn 用戶名/密碼
或者 conn+網絡服務名稱

2、斷開

disc[onnect] 用戶名/密碼

3、修改密碼

passw[ord] +自身
更改低級用戶密碼:alter user 用戶名 identity by +新密碼

4、創建用戶并設定密碼

create user 用戶名 identity by 密碼

5、刪除用戶

drop user 用戶名 [cascade] ----用戶下建表情況下使用

6、關閉數據庫實例

shut down by 密碼

7、啟動數據庫

start up

數據庫的三級模式結構:模式、外模式、內模式

(1)模式:稱為邏輯模式或概念模式,是對數據庫中全體數據的邏輯結構和特征的描述,是所有用戶的公共數據視圖。一個數據庫只有一個模式。

(2)外模式:外模式是模式的子集。外模式也稱為用戶模式,它是數據庫用戶能夠看見和使用的對局部數據的邏輯結構和特征的描述,是數據庫用戶的數據視圖。

(3)內模式:內模式也成為存儲模式,一個數據庫只有一個內模式。

三級模式之間的映射

外模式/模式映射
同一個模式可以有任意多個外模式。對于每一個外模式,數據庫系統都有一個外模式/模式映射。

模式/內模式映射
數據庫只有一個模式和外模式,即模式/內模式映射是唯一的

關系是一種規范化的二維表格,它具有以下特性:
屬性值具有原子性,不可分解
沒有重復的元組即沒有重復的行

鍵的類型:
超鍵:在一個關系中,能唯一標識元組的屬性或屬性集稱為關系的超鍵。
候選鍵:如果一個屬性集能夠唯一標識元組,且又不含有多余的屬性,稱為關系的候選鍵。

關系型數據庫的設計范式
第一范式:屬性唯一,在數據表中的字段都是單一的,不可再分的
第二范式:不存在部分函數依賴
第三范式:不存在傳遞函數依賴。

第二章 Oracle12g體系結構

三個概念去理解:實例、數據庫、數據庫服務器

Oracle的邏輯存儲結構

Oracle數據庫是由多個表空間組成,而表空間又是有多個段組成,段由多個數據區組成,數據區由多個數據塊組成。

一)數據塊
數據塊是Oracle邏輯存儲結構中的最小的邏輯單位,也是執行數據庫輸入輸出操作的最小存儲單位。
Orale服務器以數據塊為單位管理數據文件的存儲空間。
二)數據區
數據區是由一組連續的Oracle數據塊所構成的Oracle存儲結構,一個或多個數據塊組成一個數據區,一個或多個數據區在組成一個段。
區為段分配空間,它由連續的數據塊組成。
當段中所有空間已完全使用時,系統自動為該段分配一個新區。
區不能跨數據文件存在,只能存在于一個數據文件中。

三)段
段由一個或多個數據區組成。
段是構成表空間的邏輯存儲結構,段由一組區組成。
按照段所存儲數據的特征,將段分為若干種類型,主要有數據段、索引段、回退段和臨時段。

4種段:
數據段、索引段、回滾段、臨時段

四)表空間
一個表空間由一個或多個數據文件組成,一個數據文件只屬于一個表空間。
Oracle數據的存儲空間邏輯上表現為表空間,而在物理上表現為數據文件。
每個數據庫至少一個表空間,表空間的大小等于所有從屬于它的數據文件大小的總和。
(1)System表空間
系統表空間,用于存放Oracle系統內部表和數據字典的數據,例如 列名
(2)Sysaux表空間
主要存儲除數據字典以外的其他數據中的對象
(3)UNDO表空間
撤銷表空間,用于存儲撤銷信息的表空間
(4)Users表空間
可以創建各種數據對象。

Oracle物理存儲結構

Oracle數據庫的物理存儲結構有多種物理文件組成,主要有數據文件、控制文件、重做日志文件、歸檔日志文件、口令文件和警告日志文件

(一)數據文件(.DBF)
數據文件是用于保護用戶應用程序數據和Oracle系統內部數據的文件
(1)系統數據文件
(2)撤銷數據文件
(3)用戶數據文件

(二)控制文件(.CTL)
二進制文件,記錄數據庫的物理結構
每個數據庫至少擁有一個控制文件,一個數據庫可以同時擁有多個控制文件,一個控制文件只能屬于一個數據庫

(三)日志文件(.LOG)
日志文件主要記錄對數據所作的修改
(1)重做日志文件
用來記錄數據庫所有發生過的更改信息
SGA(系統全局區)
LGWR(日志寫入進程)
ARCH(歸檔進程)

(2)歸檔日志文件
(四)密碼文件、警告文件、跟蹤文件
(1)密碼文件
(2)警告文件
主要用來記錄Oracle系統的運行信息和錯誤信息

(3)跟蹤文件

Oracle11g服務器結構

Oracle服務器主要由實例、數據庫、程序全局區和前臺進程組成
實例可以分為系統全局區(SGA)、后臺進程(PMON、SMON)兩部分
程序全局區(PGA)是一個非共享的內存區域
在這里插入圖片描述
內存結構=PGA+SGA
SGA:系統全局區 實例啟動(共享)
PGA:程序全局區 服務器進程啟動(私有)

系統全局區(SGA)

主要高速緩沖區、共享池、重做日志緩沖區、java池、大型池等內存結構組成,分為三部分:
臟數據區、空閑區、保留區

(1)重置日志緩沖區
用于存放對數據庫進行修改操作時產生的日志信息。

(2)共享池(保存生成執行計劃)

select count(*)  from emp;//生成執行計劃
scott: select * from help;

共享池是SGA保留的內存區域。
共享池是對SQL、PL/SQL程序進行語法分析、編譯、執行的內存區域。
共享池由庫緩存和數據字典緩存組成。
共享池的大小直接影響數據庫的性能。

(4)數據緩沖區
用于存儲從磁盤數據文件中讀入的數據,所有用戶共享。
Oracle的用戶都是從數據緩沖區讀數據。

服務器進程中將讀入的數據保存在數據緩沖區中,當后續的請求需要這些數據時可以在內存中找到,不需要再從磁盤讀取,提高了讀取速度。
數據緩沖區的大小對數據庫的讀取速度有直接的影響。

(3)日志緩沖區
日志記錄數據庫的所有修改信息,日志信息首先產生于日志緩沖區。
當日志緩沖區的日志數據達到一定數量時,由后臺進程將日志數據寫入日志文件中。
相對來說,日志緩沖區對數據庫的性能影響較小。
符合以下任一條件日志緩沖區數據寫入日志文件中:

(1)日志緩沖區容量達到三分之一
(2)日志緩沖區容量達到一兆
(3)三秒后

(4)大型池

Oracle splile:動態參數文件

(5)Java池
(6)流池
用于數據庫與數據庫之前的信息共享。

程序全局區(PGA)

又稱用戶進程全局區,它的內存在進程私有區而不是共享區中。
(1)私有SQL區
(2)會話區

1、會話是用戶與Oracle服務器的單個連接
2、當用戶與服務器斷開連接時關閉會話
3、當用戶與服務器建立連接時創建會話
4、從V$ Session中查詢會話信息

前臺程序
A.用戶進程
能生成或執行SQL語句,稱為用戶進程
B.服務器進程

后臺程序
Oracle后臺程序是實例的重要組成部分,其中,SMON,PMON,DBWR,LGWR,CKPT這5個后臺程序必須正常啟動。

1.數據寫入進程 數據寫入操作(DBWR)的主要任務是負責將內存中的“臟”數據快回寫到數據文件中。 “臟”數據是指高速數據緩沖區中的被修改過的數據塊
1)管理系統緩沖區,將最近使用過的塊保留是在內存中
2)將修改后的緩沖區數據寫入數據文件中。

2.檢查點進程 檢查點進程(CKPT)可以看做是一個事件,當檢查點事件發生時,CKPT會要求DBWR將某些“臟數據”回寫到數據文件。分為完全檢查點和增量檢查點。
完全檢查點:兩種情況下觸發:
1、用戶發出 alter checkpoint
2、除shutdown外正常關閉

3.日志寫入進程(LGWR) 日志寫入進程用于將重做日志文件緩沖區中的數據寫入到重做日志文件。
1)負責將日志緩沖區中的日志數據寫入日志文件。
2)系統有多個日志文件,該進程以循環的方式將數據寫入文件。

4.歸檔進程(ARCH) 只有當Oracle數據庫處于歸檔模式時,該進程才可能起到作用。

5.系統監控系統(SMON) 是數據庫系統啟動時執行恢復工作的強制性進程,監控Oracle整個進程。

1.在實例失敗之后,重新打開數據庫時自動恢復實例。
2.整理數據文件的自由空間,將相鄰區域結合起來。
3.釋放不再使用的臨時段。

6.進程監控進程(PMON) 用于監控其他進程的狀態,當有進程啟動失敗時,PMON會清除失敗的用戶進程,釋放用戶進程所用的資源。
1.清理出現故障的進程
2.釋放所有當前掛起的鎖定
3.釋放故障進程使用的資源

第三章 Oracle數據庫的安裝與配置

啟動startup數據庫步驟
1創建并啟動實例
2裝載數據庫
3打開數據庫
Startup:

1.NOMOUNT模式
只會創建實例,并不會加載數據庫,也不會打開任何數據文件。

2.MOUNT 模式
啟動實例,加載數據庫,并保持數據庫的關閉狀態。

3 . Open模式
啟動、加載、打開數據庫

4 . Force模式
這種模式將終止實例并重新啟動數據庫,這種啟動模式具有一定的強制性。
關閉shutdown數據庫步驟

1關閉數據庫
2卸載數據庫
3關閉實例

SHUTDOWN :
NORMAL (正常關閉模式)
TRANSACTIONAL(事務關閉方式)
IMMEDIATE (立刻關閉)
ABORT (終止關閉方式)

第四章 SQLPLUS命令

(1)SET命令

  1. Set pagesize value 表示該變量用來設置從頂部標題至結束之間的行數。
  2. Set newpage value 用來設置一頁中空行的數量
  3. Set linesize value 一行所顯示的最多字符總數
  4. Set pause
    Off:默認,不暫停
    On:輸出的結果每一頁都暫停,用戶按回車繼續顯示
    Text:在設置pause的值為on之后,若在設置text 的值,則每次暫停都會將顯示該字符串。Off時,無效。
    5.Set numformat

(2)DESCIBE命令

查詢指定數據對象的組成結構 DESC object_name;

(3)spool命令

把查詢的結果輸出到指定文件中 eg: spool c:\emp.txt;

(4)Define 命令

定義一個用戶變量并且可以分配一個char值
Define vjob=’SALESMAN’;

(5)save 命令

將最近的一條SQL語句或PL/SQL塊保存到一個文件中,語法如下: Save file_name;

(6)把一個SQL腳本文件的內容放進SQL緩存區

Eg:get c:\dept.sql;

(7)Start 和@命令

這兩個命令都可以用來執行一個SQL腳本文件
Eg: start c:\emp.txt;

格式化命令
Column
Format
用于格式化指定的列,需要在Format關鍵字的后面加一個掩碼格式。
Ttitle和BTitle命令
頭標題和底標題
Ttitle:
Off: 表示禁止打印頭標題
On:允許打印頭標題

第五章 SQL語言基礎及調優

SQl語言的特點:
集合性、統一性、易于移植性

模式與模式對象
模式是一個數據庫對象的集合。模式為一個數據庫用戶所有,并且具有與該用戶相同的名稱。 模式對象是由用戶創建的邏輯結構,用以存儲或引用數據。

為列指定別名

select empno as "員工編號",ename as "員工名稱",job as "職務" from emp;

比較篩選

<>(A!B) :比較A與B不相等
使用all關鍵字過濾工資(sal)同時等于3000,950和800的員工記錄
Eg:select empno,ename,sal from emp where sal<>all(3000,950,800);

使用特殊關鍵字篩選

like 關鍵字  即字符串模式匹配或字符串模糊查詢,like一般與通配符連用
如:“_”,它代表一個字符   “%” 代表任意數量的字符如“K%”表示以字母K開頭的任意長度的字符串,“%M%”表示包含字符M的任意長度的字符串,“_MRKJ”表示5個字符長度且后面4個字符是MRKJ的字符串。

in關鍵字

Select  empno,ename,job from emp where job in(‘President’,’manger’,’analyst’);

Between 關鍵字

查詢工資在2000到3000之間員工之間的信息

Select empno,ename,sal from emp where sal between  2000 and 3000

分組查詢

系統默認升序 ASC

1select deptno,job from emp group by deptno,job order by deptno;2select deptno as 部門編號,avg(sal) 平均工資 from emp group by deptno     having avg(sal)>2000;

多表關聯查詢

select e.empno as 員工編號,e.ename as 員工稱呼,d.dname as 部門2  from emp e,dept d3  where e.deptno=d.deptno4  and e.job='MANAGER';

內連接

內連接是一種常見的多表關聯查詢方式,一般使用關鍵字inner join來實現,inner可以省略

select e.empno as 員工編號,e.ename as 員工名稱,d.dname as 部門2  from emp e inner join dept d3  on e.deptno=d.deptno;

外連接:
左外連接:關鍵字為LEFT OUTER JOIN 或 LEFT JOIN
右外連接:關鍵字為RIGHT OUTER JOIN 或RIGHT JOIN
完全外連接: 關鍵字為FULL OUTER JION 或FULL JOIN

左外連接

select e.empno,e.ename,e.job,d.deptno,d.dname2  from emp e left join dept d3  on e.deptno=d.deptno;

右外連接

select e.empno,e.ename,e.job,d.deptno,d.dname2  from emp e right join dept d3  on e.deptno=d.deptno;

自然連接

select empno,ename,job,dname2  from emp natural join dept3  where sal >2000;

自身連接

select  em2.ename 上層管理者,em1.ename as 下屬員工2  from emp em1 left join emp em23  on em1.deptno=em2.deptno4  order by em1.mgr;

常用函數

1.dual 是系統內部提供的一個用于實現臨時數據計算的特殊表

2.ASCII() 返回一個字符的ASCII碼

3.Concat(S1,S2) 該函數將字符串S2連接到S1的后面

4.Initcap() 第一個字母大寫

5.InSTR(s1,s2,i,j) 用于返回字符S2在字符串S1中第j次出現時的位置,搜索從字符串S1的第i個字符開始。

6.Select instr (‘oracle 11g’,’1’,3,2) abc from dual ABC

7.LTRIM(S1,S2) 刪除S1左邊的s2

8.RTRIM(S1,S2) 刪除S1右邊的S2

9.Trim 刪除s1左右的說s2

10.Replace (s1,s2,s3) 用s3替換出現在S1字符中的所有s2字符串。

11.SUBSTR(S,i,[j]) 表示從字符串s的第i個位置開始截取長度為j子字符串。

數字類函數:

13.Ceil(n) 返回大于或等于數值n的最小整數

14.FLORR(n) 返回小于或等于數值n的最大整數 轉化型函數:

15.to_char() 將表達式轉換為字符串

16.to_number(S,[format[lan]]) 返回字符串S所代表的的數字

聚合函數:
select count(empno) as 員工總數,round(avg(sal),2) as 平均工資 from
emp;

子查詢

 select empno,ename,job from empwhere deptno=select deptno from dept where dname='RESEARCH';

提示:
子查詢不能包括 Order by

多行子查詢

使用 in查詢
查詢不是銷售部門的員工信息

select empno,ename,job from emp 
where deptno in
(select deptno from dept where dname<>'SALES');

使用 ANY查詢

查詢工資大于部門標號為10的任意一個員工工資的其他部門的員工信息

 select deptno,ename,sal from emp where sal> any(select sal from  emp where deptno=10) and deptno<>10;

使用ALL查詢

查詢工資大于部門編號為30的所有員工工資的員工信息

select empno,ename,job from emp wheresal> ALL(select sal from emp where deptno=30);

關聯子查詢

查詢工資大于同職位的平均工資的員工信息。

select empno,ename,salfrom emp fwhere sal >(select avg(sal) from emp where job=f.job)order by job;

插入語句:

 insert into dept(deptno,dname,loc) values (88,'design','beijing');

更新數據:

update emp set sal=sal*1.2where job='SALSMAN';

刪除數據:

delete from scott.emp where empno=7369;

Truncate語句:
刪除表記錄,不可回滾。

事務:
原子性、一致性、隔離性、持久性
操作事務:
Commit、ROLLBACK、savepoint

EXISTS 是判斷是否存在,和in類似,但效率要比in高,返回True 或False

SELECT * FROM EMP (基礎表) WHERE EMPNO > 0 AND EXISTS (SELECT ‘X' FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO AND LOC = ‘MELB')SELECT * FROM EMP (基礎表) WHERE EMPNO > 0 AND DEPTNO IN(SELECT DEPTNO FROM DEPT WHERE LOC = ‘MELB')

第六章 PL/SQL編程

PL/SQL程序都是以塊為基本單位,分三部分:
聲明部分(declare) 執行部分(begin開頭) 異常處理(exception) end

(1) declare 可以聲明變量、常量、游標
(2) Begin ——end
(3) Exception

計算兩個數的和與兩個數的差的商
Eg:

 SQL> set serveroutput on;(在服務器端顯示執行結果)SQL> declare 2  a int:=100;3  b int:=200;4  c number;5  begin6   c:=(a+b)/(a-b);7  dbms_output.put_line(c);8  exception9   when zero_divide then10   dbms_output.put_line('除數不能為零!');11  end

數據類型、變量和常量

(一)基本數據類型
1.數值類型
數值類型主要包括number(儲存整數或浮點數)、PLS_INTEGER(pls_integer)和BINARY_INTEGER(binary_interger)只儲存整數

Number(p,s) 參數p: 表示精度(有效數字) 參數S:表示刻度范圍
number(9,2)9表示這個數據的有效位數(精度),2表示兩個小數位(刻度)例如:1234567.89 允許有7位整數,小數點后2位小數

(二)特殊類型:
1.%TYPE類型
使用%type關鍵字聲明一個與列名稱類型完全相同的數據類型

Eg: declare  
var_job emp.job %type;

輸出emp表中編號為7369的員工名稱和職務信息

set serveroutput on;
SQL> declare 2  var_ename emp.ename%type;3  var_job   emp.job%type;4  begin5    select ename,job into 6    var_ename,var_job7   from emp 8  where empno=7369;9  dbms_output.putline(var_name||'的職務是'||var_job);10  end;
11  /

2.RECORD類型(記錄類型)
使用該類型可以儲存由多個列值組成的一行數據。
舉例:聲明一個記錄類型emp_type,然后使用該類型的變量儲存emp表中的一條記錄信息,并輸出這條記錄信息。

SQL> set serveroutput on;
SQL> declare2  type emp_type is record6  ( var_ename varchar2(20),var_job varchar2(20),var_sal number);7   empinfo emp_type;8  begin9   select ename,job,sal10   into emp 11  from emp12  where empno=7369;13  dbms_output.putline('雇員'||empinfo.var_ename||'的職務是'||empinfo.var_job||'、工資是'||empinfo.var_sal);14  end;15  /

3.%ROWTYPE類型
可以根據數據表中行的結構定義一種特殊的數據類型,用來儲存存數據表中檢索到的一行數據。
比如:聲明一個%rowtype類型的變量rowVar_emp,然后使用該變量儲存emp表中的一行數據,代碼如下:

 SQL> set serveroutput onSQL> declare 2  rowVar_emp  emp%rowtype;3  begin4   select * into rowVar_emp 5  from emp 6  where empno=7369;7  dbms_output.putline();8  end;9  /

流程控制語句

1.If…then
end if
舉例:使用if…then 語句比較兩個字符串變量

SQL> set serveroutput on;
SQL> declare2  var_name1 varchar2(50);3  var_name2 varchar2(60);4  begin 5   var_name1:='EAST';6   var_name2:='xiaoke';7  if length(var_name1)<length(var_name2) then8  dbms_output.putline();9  end if;10  end;
11  /

2.If…then

else
end if
通過if…else語句實現只有年齡大于等于56歲才可以申請退休,否則提示不可以退休。

SQL> set serveroutput on;
SQL> declare2  age  int:=55;3  begin 4   if age>=56  then5   dbms_output.put_line('你可以退休了!');6   else7   dbms_output.put_line('你小于56歲,不可以申請退休!');8  end if;9  end;10  /

3.If…then

Elsif … then

Else

End if

Eg:set serveroutput on;
DelcareMonth int:=10;
Begin If month<10 thenDbms_ouput.putline(‘’);Elsif  month>=4 and monthe<=6 thenDbms_output.putline(‘’);
Elsif month>=7 and mon<=9 thenDbms_output.putline(‘’);
Else

4.Case語句:

Case <selector>
When   <expression 1> then plsql_sentences_1;
When   <expression 2> then plsql_sentences_2;
When   <expression 3> then plsql_sentences_3;
When   <expression 4> then plsql_sentences_4;
End case;

舉例: 指定一個季節,使用case語句說明月份信息

Set serveroutput onDeclareSeason int:=3;Aboutinfo varchar2(50);
BeginCase seasonWhen 1 then Aboutinfo:=season||’季節包括12, 3月份’; 
When 2 then
Aboutinfo:=season||’季節包括7,8,9月份’;End case;Dbms_output.putline(Aboutinfo);End;/

5.循環語句
Loop語句

Loop 
...
Exit when
..
End if
End
/

舉例: 用loop函數求前100個自然數的和,輸出到屏幕上去。

Set serveroutput onDeclare Sum_i  int:=0;i  int:=0;
BeginLoopi:=i+1;Sum_i=Sum_i+i;Exit when i=100;End loop;Dbms_output.putline(‘’);End;
/  

6 . While 語句
舉例:

Declare Sum_i int:=0;I int:=0;
BeginWhile i<=99 loopi=i+1;Sum_i=Sum_i+i;
End loop;
Dbms_output.putline();
End;

7 . for語句
舉例:前100個自然數中偶數之和

Declare
Sum_i :int=0;
BeginFor i in reverse 1..100 loopIf mod(i,2) =0 then
Sum_i=Sum_i+i;
End if;
End loop;
Dbms_output.putline();
End
/

PL/SQL游標

通常用于查詢結果集,每次只能讀取一行數據
4個步驟如下:

聲明游標、打開游標、讀取游標、關閉游標

1.聲明游標

 Cursor cur_name(intput _parameter1)

Intput_parameter1:參數
定義如下:

Para_name [in] datatype [{:=|Default } para_value]

舉例:聲名一個游標,用來讀取emp表中職務為 銷售員的信息;

Declare Cursor cur_emp(var_job in  varchar2:=’SALESMAN’)Is  select empno,ename,sal
From emp;
Where job=var_job;

2.打開游標

Open cur_name(value)
Open cur_emp(‘MANAGER’);

3.讀取游標

Fetch cur_name into {variable}

舉例:

 Declare 
Cursor cur_emp(var_job in varchar2:=’SALESMAN’)
Is select empno,ename,salFrom emp
Where job=var_job;
Type record_emp is record
( Var_emp emp.empno%type,Var_ename emp.ename%type,Var_sal    emp.sal%type
);Emp_row record_emp;
BeginOpen cur_emp(‘MANAGER’);Fetch cur_emp into emp_row;
While cur_emp%found loop
Dbms_output.putline();Fetch cur_emp into emp_row;
End loop;
Close cur_emp;
End;
/

4.關閉游標

Close cur_name;

游標屬性

%found:布爾型屬性,如果SQL語句至少影響一行數據,該屬性為true,否則為false;
%rowcount:數字型屬性,返回SQL語句影響的行數。
%isopen:布爾型屬性打開游標為true,關閉為false。
SQL> set serveroutput on;
SQL> declare2  var_ename varchar2(50);3  var_job varchar2(50);4  cursor cur_emp5  is select ename,job6  from emp7  where empno=7499;8  begin9   open cur_emp10   fetch cur_emp into var_ename,var_job;11  if cur_emp%found then12   dbms(‘’||   ||,||;13   else14   dbms(‘’);15  end if;16  end 
17  /

存儲過程
只能通過execut命令執行
儲存過程:

create or replace pro_name() is
Begin
...
Commit
End pro_name;
/

舉例:

Create or replace procedure insert_dept(Num_deptnp in number,var_ename in varchar2,Var_loc in varchar2
)  is 
Begin Insert into dept
Values(num_deptno,var_ename,var_loc);
Commit;
End insert_dept;

Oracle 邏輯存儲結構:
數據文件、控制文件、日志文件

Oracle物理存儲結構:
數據塊、數據區、段、表空間

Oracle數據
由實例、數據庫、程序全局區、前臺進程組成

實例可以分為系統全局區(SGA)、后臺進程(PMON,SMON)
PGA(程序全局區)是一個非共享的內存區域。

Spool命令把查詢結果輸入到指定文件中
事務:
原子性、一致性、隔離性、持久性
聲明游標、打開游標、讀取游標、關閉游標
Execute();
重命名表空間:

Alter tablespace tbs_test_3 rename to tbname;
Constirant 約束
Alter table student drop(sex_age);
Create or replace trigger tri_deptBefore insert or replace or delete
On dept;
Declare Var_tag varchar2(10);
BeginIf inserting then Var_tag:=’插入’;Elsif update then Elsif insert thenElsif insert thenEnd if
Insert into dept
Values(var_tag,sysdate);
Create or repalce trigger tri_insert_good
Before insert
On goodsFor each now
Begin Select seq_id.nextvalInto :new .id
From dual;
End;
/
Create or replace package  package_emp is
Function  fun_avg_sal(num_deptno number) return number isNum_avg_sal number;BeginSelect avg(sal) Into num_avg_salFrom empWhere deptno=num_deptno;
Return(num_sal);

SqlPlus column命令用法

column是sqlplus里最實用的一個命令,很多時候sql語句輸出的列寬度不合適而影響查看,都需要用到這個命令來更改select語句中指定列的寬度和標題。大部分時候,我們可以簡寫column為col即可,主要有以下用法:

修改列寬度

col c1 format a20 –將列c1(字符型)顯示最大寬度調整為20個字符
col c1 format 9999999 –將列c1(number型)顯示最大寬度調整為7個字符

修改列標題

col c1 heading c2 –將c1的列名輸出為c2

設置列的對齊方式

SQL> col ename justify left/right/center;
SQL> select empno, ename, job from emp;

注意:對于number類型的數據默認為右對齊,其他默認為左對齊
隱藏某列顯示:col job noprint

SQL> col job noprint;
SQL> select empno, ename, job from emp;

格式化number類型列的顯示:column sal format $999,999.00

SQL> column sal format $999,999.00
SQL> select empno, ename, sal from emp;

設置列值,若列植為空以text代替

SQL> col comm null text
SQL> select * from emp;

顯示列的當前屬性

SQL> column ename;

重置為默認值:

SQL> clear columns;

一行只顯示數字位的長度, 超過長度折行, 加word_wrapped后, 單詞不會折行

column info format a40 word_wrapped

設置列頭

sql> column ename heading '姓名' format a15

觸發器例題

為emp表創建一個觸發器,當執行插入操作時,統計操作后員工人數;當執行更新工資操作時,統計更新后員工平均工資;當執行刪除操作時,統計刪除后各個部門的人數。

CREATE OR REPLACE TRIGGER trg_emp_dml
AFTER INSERT OR UPDATE OR DELETE ON emp
DECLAREv_count NUMBER;v_sal   NUMBER(6,2);
BEGINIF INSERTING THEN SELECT count(*) INTO v_count FROM emp;DBMS_OUTPUT.PUT_LINE(v_count);ELSIF UPDATING THENSELECT avg(sal) INTO v_sal FROM emp;DBMS_OUTPUT.PUT_LINE(v_sal);ELSEFOR v_dept IN (SELECT deptno,count(*) num FROM emp GROUP BY deptno) LOOPDBMS_OUTPUT.PUT_LINE(v_dept.deptno||' '||v_dept.num);END LOOP;END IF;
END trg_emp_dml; 

為emp表創建一個觸發器,當插入新員工時顯示新員工的員工號、員工名;當更新員工工資時,顯示修改前后員工工資;當刪除員工時,顯示被刪除的員工號、員工名。

CREATE OR REPLACE TRIGGER trg_emp_dml_row
BEFORE INSERT OR UPDATE OR DELETE ON emp
FOR EACH ROW
BEGINIF INSERTING THEN DBMS_OUTPUT.PUT_LINE(:new.empno||' '||:new.ename);ELSIF UPDATING THENDBMS_OUTPUT.PUT_LINE(:old.sal||' '||:new.sal);ELSEDBMS_OUTPUT.PUT_LINE(:old.empno||' '||:old.ename);END IF;
END trg_emp_dml_row;

修改員工工資時,保證修改后的工資高于修改前的工資。

CREATE OR REPLACE TRIGGER trg_emp_update_row
BEFORE UPDATE OF sal ON emp
FOR EACH ROW
WHEN(new.sal<=old.sal)
BEGINRAISE_APPLICATION_ERROR(-20001,'The salary is lower!');
END trg_emp_update_row; 

創建一個包括員工及其所在部門信息的視圖empdept,然后向視圖中插入一條記錄(2345,’TOM’,3000,’SALES’)

create or replace trigger tri_insert_viewinstead of inserton view_emp_dept--創建一個關于view_emp_dept視圖的替換觸發器for each row--是行級視圖
declarerow_dept dept%rowtype;
beginselect * into row_dept from dept where deptno = :new.deptno;--檢索指定部門編號的記錄行if sql%notfound then--未檢索到該部門編號的記錄insert into dept(deptno,dname)values(:new.deptno,:new.dname);--向dept表中插入數據end if;insert into emp(empno,ename,deptno,job,hiredate)values(:new.empno,:new.ename,:new.deptno,:new.job,:new.hiredate);--向emp表中插入數據
end tri_insert_view;
/

當數據庫中執行CREATE操作時,將創建的對象信息記錄到ddl_creations表中。

CREATE TABLE ddl_creations (user_id       VARCHAR2(30),object_type    VARCHAR2(20),object_name   VARCHAR2(30),object_owner  VARCHAR2(30),creation_date  DATE);CREATE OR REPLACE TRIGGER log_creations
AFTER CREATE ON DATABASE
BEGININSERT INTO ddl_creationsVALUES(ora_login_user, ora_dict_obj_type, ora_dict_obj_name, ora_dict_obj_owner, sysdate);
END log_creations;

為了實現在更新員工所在部門或向部門插入新員工時,部門中員工人數不超過8人,可以在emp表上創建兩個觸發器,同時創建一個共享信息的包。

CREATE OR REPLACE PACKAGE mutate_pkg 
ASv_deptno NUMBER(2); 
END;CREATE OR REPLACE TRIGGER  rmutate_trigger
BEFORE INSERT OR UPDATE OF deptno ON EMP 
FOR EACH ROW
BEGINshare_pkg.v_deptno:=:new.deptno;  
END; CREATE OR REPLACE TRIGGER smutate_trigger
AFTER INSERT OR UPDATE OF deptno ON EMP
DECLAREv_num number(3);
BEGINSELECT count(*) INTO v_num FROM emp WHERE deptno=share_pkg.v_deptno;IF v_num>8 THENRAISE_APPLICATION_ERROR(-20003,'TOO MANY EMPLOYEES IN DEPARTMENT '||share_pkg.v_deptno);END IF;
END; 

選擇題

1.有4條與游標有關的語句,它們在程序中出現的正確順序是:( B )

  1. OPEN abc
  2. CURSOR abc IS SELECT ename FROM emp
  3. FETCH abc INTO vname
  4. CLOSE abc
    A.1、2、3、4 B.2、1、3、4
    C.2、3、1、4 D.1、3、2、4

2.數據庫運行在歸檔模式下,如果發生日志切換,為了保證不覆蓋舊的日志信息,系統將啟動如下哪個進程?( D )
A.DBWR B.LGWR
C.SMON D.ARCH

3.對于ROLLBACK命令,以下準確的說法是:( C )
A.撤銷剛剛進行的數據修改操作
B.撤銷本次登錄以來所有的數據修改
C.撤銷到上次執行提交或回退操作的點
D.撤銷上一個COMMIT命令

4.創建表空間時,可以指定表空間中存儲對象的默認存儲參數,其中哪個參數用于設置分配給每一個對象的初始區大小( B )
A.NEXT B.INITIAL
C.PCTINCREASE D.MINEXTENTS

5.現將CONNECT 角色授予TEXT_ROLE角色,下面哪個語句可以實現( D )
A.GRANT ROLE CONNECT ON TEST_ROLE;
B.GRANT ROLE CONNECT TO TEST_ROLE;
C.GRANT CONNECT ON TEST_ROLE;
D.GRANT CONNECT TO TEST_ROLE;

填空題

1.Oracle數據庫系統的物理存儲結構主要有三類文件組成,分別: 數據文件 控制文件 日志文件 。邏輯存儲結構包括 數據塊,數據區,段,表空間
2.SQL*Plus中直接調用過程的關鍵字是 EXECUT ;查詢中去掉重復的行,必須使用的關鍵字是 DISTINCT ; 關鍵字 DESCRIBE 可以用來顯示表的結構信息。
3.使用EXPORT命令時,可以有3種不同方式導出數據,表方式(T方式) 就是導出一個指定的基本表,包括表的定義和數據及表上的索引、約束等。 用戶 方式(U方式) 是導出一個用戶的所有對象,包括表、視圖、存儲過程、序列等。 全庫方式 (Full方式) 是導出數據庫中所有的對象。
4.在ORACLE數據庫中,將權限分為兩類即 系統權限 對象權限 ,分別指在系統級控制數據庫的存取和使用機制和在模式對象上控制存取和使用的機制。

判斷題

1.INSERT(改為UPDATA)事件觸發器中可以使用:old偽記錄;DELETE事件觸發器中可以使用:new偽記錄。 ( 錯 )
2.后臺進程LGWR的作用是數據庫寫入程序。 ( 錯 )
3.Alter user tempuser Identified by oracle Default tablespace users Default temporary tablsespace temp Quota 100M on users ( 對 )
4.SQL*PLUS中,顯示登錄的用戶的命令是DESCRIB user。 ( 錯 )
5.默認登錄Oracle Enterprise Manager Database Control 的端口號是1158。( 對 )

簡答題

1.How to connect remote oracle server by SQLPLUS? Please write down the steps and the operating statements?
如何通過SQL
PLUS連接遠程oracle服務器?請把操作步驟和操作報表寫下來。

方式一:

簡易連接,不用進行網絡配置,其實就是tnsname.ora文件,但只支持oracle10G以上。 命令:sqlplus 用戶名/密碼@ip地址[:端口]/service_name [as sysdba]
示例:sqlplus sys/pwd@ip:1521/test as sysdba
備注:使用默認1521端口時可省略輸入

方式二:進行網絡配置 oracle9i和以前的版本

1.圖形化操作:Net Configuration Assistant–> 本地Net服務名配置–>添加->服務名->協議(選tcp)->主機名稱->端口->完成。

2.(最常用):配置監聽,配置tnsname.ora文件
例如:

ORA11GR2 =(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.2.6)(PORT = 1521))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = PROD)))

方式三:(EZConnect字符串):
配置sqlnet.ora文件:

sec@secdb /home/oracle$ cat $ORACLE_HOME/network/admin/sqlnet.ora
#sqlnet.ora Network Configuration File: /oracle/app/oracle/product/10.2.0/db_1/network/admin/sqlnet.ora
#Generated by Oracle configuration tools.
NAMES.DIRECTORY_PATH= (TNSNAMES,EZCONNECT)
cmd窗口或者 linux下:sqlplus 用戶名/密碼@ip/實例名稱;

2.What is the difference between procedures and functions in the Oracle database?(Oracle數據庫中的過程和函數有什么不同)

1.存儲過程定義關鍵字用procedure,函數定義用function。 2.存儲過程中不能用return返回值,但函數中可以,而且函數中必須有return子句。
3.函數可以可以在查詢語句中直接調用單獨執行,存儲過程必須通過execute執行單獨調用
4.函數可以當做表達式使用

3.讀懂如下程序:

CREATE OR REPLACE FUNCTION ret_deptinfo(p_deptno dept.deptno%TYPE,   p_num OUT NUMBER,   p_max OUT NUMBER)
RETURN dept.dname%TYPE 
ASv_dname dept.dname%TYPE;
BEGINSELECT dname INTO v_dname FROM dept WHERE deptno=p_deptno;SELECT count(*),max(sal) INTO p_num,p_max    FROM emp WHERE deptno=p_deptno;RETURN v_dname;
END ret_deptinfo; 

分析程序實現的功能:

4.輸入和運行以下程序:

CREATE OR REPLACE TRIGGER CHECK_SAL
BEFORE 	UPDATE 	ON emp
FOR EACH ROW
BEGIN
IF :new.job='CLERK' AND (:new.sal<500 OR :new.sal>1000) THENRAISE_APPLICATION_ERROR(-20001, '工資修改超出范圍,操作取消!');
END IF;
END;

分析程序實現的功能:

設計題

1、創建一個存儲過程,以部門號為參數,查詢該部門的平均工資,并輸出該部門中比平均工資高的員工號、員工名。并且調用該存儲過程,要求根據輸入部門編號,查詢平均工資及輸出比平均工資高的員工號、員工名。

CREATE OR REPLACE PROCEDURE show_emp( p_deptno emp.deptno%TYPE)
ASv_sal emp.sal%TYPE;
BEGINSELECT avg(sal) INTO v_sal FROM emp WHERE deptno=p_deptno;DBMS_OUTPUT.PUT_LINE(p_deptno||' '||'average salary is:' ||v_sal);FOR v_emp IN (SELECT * FROM emp WHERE deptno=p_deptno AND sal>v_sal) LOOPDBMS_OUTPUT.PUT_LINE(v_emp.empno||' '||v_emp.ename);END LOOP;
EXCEPTIONWHEN NO_DATA_FOUND THENDBMS_OUTPUT.PUT_LINE('The department doesn’’t exists!');
END show_emp;

過程調用語句:

declare
vdeptno emp.detpno%type;
Begin
vdeptno:=&deptno;
show_emp(vdeptno);
End; 

2、創建一個函數,以部門號為參數,返回部門名、部門人數及部門平均工資。并且調用該函數,輸出所有有員工的部門的名稱、部門人數和平均工資。

CREATE OR REPLACE FUNCTION ret_deptinfo( p_deptno dept.deptno%TYPE,p_num OUT NUMBER, p_avg OUT NUMBER)
RETURN dept.dname%TYPE
ASv_dname dept.dname%TYPE;
BEGINSELECT dname INTO v_dname FROM dept WHERE deptno=p_deptno;SELECT count(*),avg(sal) INTO p_num,p_avg FROM emp WHERE deptno=p_deptno;RETURN v_dname;
END ret_deptinfo; 
函數調用語句:
DECLAREv_avgsal emp.sal%TYPE;v_num    NUMBER;v_dname  dept.dname%TYPE;
BEGINFOR v_dept IN (SELECT DISTINCT deptno FROM emp) LOOPv_dname:=ret_deptinfo(v_dept.deptno,v_num,v_avgsal);DBMS_OUTPUT.PUT_LINE(v_dname||'  '||v_maxsal||'  '||  v_avgsal||' '||v_num);END LOOP;
END;

3、創建學生表student(sno,sname,sex,sage),要求學號sno主鍵,姓名sname不能重復, 性別sex只能是‘男’或者‘女’,年齡sage在15到25之間。創建課程表course(cno,cname),要求課程號cno主鍵,課程名cname唯一,同時為主鍵約束列上的唯一性索引設置存儲位置和存儲參數。創建學生選課表SC(sno,cno,grade),要求成績grade大于0小于100,有兩位小數,sno,cno都是外鍵,而且sno,cno一起做主鍵。

CREATE TABLE student(sno NUMBER(6) CONSTRAINT S_PK PRIMARY KEY,sname VARCHAR2(20)  UNIQUE,sex CHAR(2) CONSTRAINT S_CK1 CHECK(sex in('男', '女')),sage  NUMBER(6,2) CONSTRAINT S_CK2 CHECK(sage between 15 and 25));
CREATE TABLE course(cno   NUMBER(6) PRIMARY KEY,cname CHAR(20) UNIQUE USING INDEX TABLESPACE USERSTORAGE (INITIAL 64K NEXT 64K)); 
CREATE TABLE  SC(sno NUMBER(6) REFERENCES student(sno),cno NUMBER(6) REFERENCES course(cno),grade NUMBER(5,2) CHECK(grade between 0 and100)CONSTRAINT SC_PK PRIMARY KEY(sno, cno)  );

4、創建用戶user2,口令為user2,默認表空間為USERS,在該表空間的配額為10 MB,初始狀態為鎖定。創建用戶user3,口令為user3,默認表空間為USERS,在該表空間的配額為10 MB,概要文件為example_profile(假設該概要文件已經創建),為用戶user2授予CREATE SESSION,CREATE TABLE ,CREATE VIEW系統權限。user2獲得權限后,為用戶user3授予CREATE TABLE權限。然后回收user2的CREATE TABLE權限。

SQL> conn system/oracle@orcl   或者 conn / as sysdba   僅供參考,正確就行
SQL>CREATE USER user2IDENTIFIED BY user2DEFAULT TABLESPACE USERS QUOTA 10M ON USERSACCOUNT LOCK;
SQL> CREATE USER user3 IDENTIFIED BY user3 DEFAULT TABLESPACE USERS QUOTA 10M ON USERSPROFILE example_profile ; 
SQL> GRANT CREATE SESSION,CREATE TABLE,CREATE VIEWTO user2 WITH ADMIN OPTION;
SQL> CONNECT user2/user2 @ORCL 
SQL> GRANT CREATE TABLE TO user3;
SQL> conn system/oracle@orcl   或者 conn / as sysdba
SQL> revoke CREATE TABLE from user2;

5、使用EXPDP導出scott模式相關數據,并使用IMPDP 將剛剛導出的scott模式相關數據導入到system模式,寫出核心操作語句。

1、創建DIRECTORY :create directory dir_dp as 'D:/oracle/dir_dp'; 
2、授權		:Grant read,write on directory dir_dp to scott;
3、執行導出
expdp scott/tiger@orcl schemas=scott directory=dir_dp dumpfile =expdp_test1.dmp logfile=expdp_test1.log;
4、執行導入
impdp system/oracle@orcl directory=dir_dp dumpfile =expdp_test1.dmp remap_schema=scott:system  logfile=impdp_test1.log;

實驗一

(1)使用Scott用戶:
在這里插入圖片描述
(2)顯示所有薪水低于3000的雇員的工作、姓名和工資:
在這里插入圖片描述
(3)添加一個居中、兩行顯示的表頭“Employee Report”和一個居中的頁腳“Confidential”:
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
(4)重新命名工作列標題為“Job Category”,分兩行。重新命名姓名列標題為“Employee”,重新命名工資列標題為“Salary”并且格式化為$9,999.99
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
(5)文件操作
在這里插入圖片描述
SQL> select job,ename,sal from emp;

星期日 9月 22 第 1
Employee Report

Job
Category Employee Salary


CLERK SMITH 800
SALESMAN ALLEN 1600
SALESMAN WARD 1250
MANAGER JONES 2975
SALESMAN MARTIN 1250
MANAGER BLAKE 2850
MANAGER CLARK 2450
ANALYST SCOTT 3000
PRESIDENT KING 5000
SALESMAN TURNER 1500
CLERK ADAMS 1100
CLERK JAMES 950
ANALYST FORD 3000
CLERK MILLER 1300
Confidential

已選擇14行。

SQL> spo off;

實驗二

在這里插入圖片描述
在這里插入圖片描述
分析:

相同點:兩者都為子查詢,有著相似的格式,對于查詢的結果兩者具有相同的作用。
不同點:not in 前需跟上返回且需比較的列名。

not esists定義:子查詢不返回任何一行時條件為true,是對"行”的比較
not in定義: 與子查詢返回結果中任何一個值都不等,是對“數值”的比較,需加上數值所屬的列名

實驗三

在這里插入圖片描述
1、

Select empno,ename,(sal+nvl(comm,0))*12 as all_sal from emp order by all_sal;

2、

select * from emp where hiredate >to_date(1982/1/1,’yyyy/mm/dd’);

3、

select max(sal),avg(sal) from emp order by deptno,job;

4、

select *from emp where (deptno, job)=(select deptno,job from emp where ename='SMITH');
select * from emp where deptno = (select deptno from emp where ename='SMITH')
and job = (select job from emp where ename='SMITH');

5、

select e.ename,e.job,m.ename,d.dname from emp e,emp m,dept d
where e.mgr=m.empno and e.deptno = d.deptno;

6、 待定

select dname,count(*) from dept 
where deptno in(select deptno from emp where sal>1000 group by deptno having count(deptno)>2);

7、

select e1.empno,e1.ename from emp e1,emp e2where e1.job=e2.job and e1.hiredate>e2.hiredate and e1.sal>e2.sal;

8、
右連接

select empno,ename,dname from dept
right join emp 
on dept.deptno=emp.deptno and dept.deptno=20;
select empno,ename,dname from dept,emp
where dept.deptno(+)=emp.deptno and dept.deptno(+)=20;

左連接

select empno,ename,dname from dept
left join emp
on deptno=emp.deptno and dept.deptno=20;
select empno,ename,dname from dept,emp
where dept.deptno=emp.deptno(+) and dept.deptno(+)=20;

9、

select * from emp where empno 
in(select mgr from emp where mgr is not null);

10、

declare變量聲明、初始化
begin 業務處理、邏輯代碼
exception 異常捕獲
end;

11、

DECLARETYPE t_emp IS RECORD(empno NUMBER(4), ename CHAR(10),sal   NUMBER(6,2));v_emp t_emp;
BEGINSELECT empno,ename,sal INTO v_emp FROM emp WHERE empno=7844;DBMS_OUTPUT.PUT_LINE(v_emp.ename||' '||v_emp.sal);
END;

12、

DECLARE v_empno NUMBER(4);
BEGINv_empno:=&x;UPDATE emp SET sal=sal+100 WHERE empno=v_empno;
END; create or replace procedure ChangeSal(p_empno in emp.empno%type,p_sal in emp.sal%type)
as
beginupdate set emp sal=p_sal where empno=p_empno;
end;

13、

create or replace procedure ChangeSal( p_empno in emp.empno%type)
asp_deptno emp.deptno%type;
beginselect deptno into p_deptno from emp where empno=p_empnoif p_deptno = 10 thenupdate emp set sal = sal+100 where empno = p_empnoelsif p_deptno = 20 thenupdate emp set sal = sal+160 where empno=p_empnoelsif p_deptno = 30 thenupdate emp set sal = sal+200 where empno=p_empnoelseupdate emp set sal = sal+300 where empno=p_empnoend if;
end;

14、

declare
p_ename emp.empno%type;
p_job emp.job%type
cursor cur_emp
is select ename,job from emp where empno=7654;
begin
open cur_emp;
fetch cur_emp into p_ename,p_job;
if cur_emp%found then
dbms_output.put_line('名字:'||p_ename||' 職務:'||p_job)
else
dbms_output_line('無數據記錄');
end if;
end;

15、

CREATE OR REPLACE PROCEDURE return_deptinfo(p_deptno emp.deptno%TYPE,p_avgsal OUT emp.sal%TYPE,p_count  OUT emp.sal%TYPE)
AS
BEGINSELECT avg(sal),count(*) INTO p_avgsal,p_count FROM emp WHERE deptno=p_deptno;
EXCEPTIONWHEN NO_DATA_FOUND THENDBMS_OUTPUT.PUT_LINE('The department don’’t exists!');
END return_deptinfo; 

16、

create or replace function return_avg(p_deptno emp.deptno%type)
return number
isp_avgsal emp.sal%type;
beginselect avg(sal) into p_avgsal from emp where deptno = p_deptno;return (p_avgsal);
exceptionwhen no_data_found thendbms_output.putline('該部門編號不存在');return (0);
end;

17、

create or replace trigger tri_emp
after insert or update or delete on emp
declarev_count number;v_sal number(6,2);
beginif inserting thenselect count(*) into v_count from emp;dbms_output.put_line(v_count);elsif updating thenselect avg(sal) into v_sal from emp;dbms_output.put_line(v_sal);elsefor v_dept in (select deptno,count(*) num from emp group by deptno)loopdbms_output.putline(v_dept.deptno||' '||v_dept.num);end loop;end if;
end;

18、

create or replace package pack_emp isfunction return_avg(p_deptno emp.deptno%type) return number;procedure change_sal(p_job emp.job%type,p_sal emp.sal%type);end pack_emp;

19、

create or replace package body pack_emp isfunction return_info(p_deptno emp.empno%type) return number isp_avgsal emp.sal%type;beginselect avg(sal) into p_avgsal from emo where deptno = p_deptno;return (p_avgsal);exceptionwhen no_data_found thendbms_output.putline('該部門編號不存在');return 0;end return_avg;procedure change_sal(p_job emp.job%type,p_sal emp.sal%type)beginupdate emp set sal = sal*(1+p_sal) where job=p_job;end change_sal;
end;

20、

declarep_deptno emp.deptno%type;p_job emp.job%type;p_avgsal emp.sal%type;p_sal emp.sal%type;
beginp_deptno :=10;p_avgsal :=pack_emp.return_avg(p_deptno);dbms_output.putline(p_deptno||'號部門的平均工資是:'||'p_avgsal');p_job :='SALESMSN';p_sal :=0.1;pack_emp.chang_sal(p_job,p_sal);
end;

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/530967.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/530967.shtml
英文地址,請注明出處:http://en.pswp.cn/news/530967.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Openstack面試題和知識點總結

文章目錄知識點云計算起源定義特點分類服務類型平臺分類應用虛擬化虛擬化技術定義分類云計算和虛擬化的關系虛擬化的優點OpenStack簡介核心架構Openstack組件共享服務組件核心組件組件詳解RabbitMQ概念特點rabbitmq中的概念工作原理常用操作MemcachedKeystoneGlance工作原理Nov…

實例化一個對象

類實例化就是新建一個類的對象&#xff0c;就是new一個對象 類名 對象名 new 類名&#xff08;&#xff09;;例子&#xff1a;Student stu new Student&#xff08;&#xff09;; 注意&#xff1a; 類在沒有實例化之前,就是new之前,它的屬性,方法等等在內存中都是不存在的.…

RuntimeException:java.lang.ClassNotFoundException: Class wordcount.WordCountMapper not fonud

在hadoop上運行Mapreduce項目jar包報錯&#xff1a; Error: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class wordcount.WordCountMapper not foundat org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2638)at org.apache.hadoop.ma…

auto.js 實現信息發送、QQ點贊、微信點贊、健康日報簽到

文章目錄auto.js開發文檔安裝total control在手機端安裝auto.js apk安裝vscode短信多條發送QQ點贊微信點贊健康日報填寫疊貓貓auto.js開發文檔 點擊學習 安裝total control total control 用于手機投屏在電腦屏幕上 在手機端安裝auto.js apk 鏈接&#xff1a;https://pan.…

MapReduce綜合學習含Wordcount案例

文章目錄MapReduce簡介MapTaskReduceTaskMapper階段解讀Reducer階段解讀MapReduce適用的問題MapReduce的特點MapReduce基本思想大數據處理思想&#xff1a;分而治之構建抽象模型&#xff1a;Map 函數和 Reduce 函數上升到架構&#xff1a;并行自動化并隱藏底層細節MapReduce計算…

基于Spring boot+Vue的在線考試系統

文章目錄spring boot 分層圖解安裝idea配置阿里云鏡像項目啟動前端項目結構項目前端中index.htmlApp.vuemain.jsrouter整個頁面渲染過程關于矢量圖圖標的使用引入JQuery依賴github-markdown-css樣式文件-一般用作文章正文的樣式美化spring boot 分層圖解 安裝idea 安裝參考 id…

Java基礎總結之(面試)

文章目錄Java標識符Java修飾符訪問權限修飾符訪問控制和繼承非訪問權限修飾符局部變量修飾符接口接口中方法修飾符運算符算術運算符一元運算符二元運算符算術賦值運算符賦值運算符邏輯運算符&#xff08;&&、||和!&#xff09;關系運算符自增和自減運算符&#xff08;和…

Javaweb練手項目

文章目錄學生管理系統音樂網站鋒芒博客中醫藥管理系統博客天梯CMS系統鋒芒社團官網學生管理系統 實現技術&#xff1a;ServletMVC&#xff08;模式&#xff09;Filter(過濾器&#xff09;html 主要功能&#xff1a;學生信息的增刪查改&#xff0c;文件&#xff08;圖片&#x…

Spark之scala學習(基礎篇)待更新

文章目錄引言大數據介紹大數據與云計算區別大數據和人工智能的區別大數據和傳統的分析&#xff08;excel&#xff09;的區別scala的特性面向對象特性函數式編程函數式編程的特點&#xff1a;函數式編程的優勢靜態類型擴展性并發性為什么要學scalascala安裝簡單測試了解ScalaSca…

Jupyter Notebook的安裝及問題解決方案

文章目錄下載并安裝Anaconda3更改主界面路徑但是如果沒有jupyter_notebook_config.py文件怎么辦&#xff1f;如果更改過路徑后&#xff0c;不生效怎么辦&#xff1f;使用參考pycharm導入pyspark下載并安裝Anaconda3 官網下載個人版 Anaconda3安裝參考 點擊&#xff0c;然后進…

airodump-ng wlan0mon掃描不到網絡_MySQL ProxySql 由于漏洞掃描導致的 PROXYSQL CPU 超高...

ProxySQL 本身是一款非常棒的MYSQL 中間件的開源產品, 在公司運行了一段時間后,突然一天報警,所在機器的CPU 出奇的高,之前在測試系統, 預生產, 以及生產系統均沒有出現問題. 開始未來緊急解決問題,重新啟動了proxysql服務,并查看錯誤日志.PROXYSQL 的系統版本的2.012 MYSQL 的…

網絡安全之SQL注入

文章目錄SQL注入的定義SQL注入為什么會成功&#xff1f;為什么發生SQL注入&#xff1f;SQL注入的分析SQL的注入流程判斷SQL注入點判斷注入類型SQL注入的通常方法防止SQL注入SQL注入的定義 SQL注入是通過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串&#xff0c…

4個空格和一個tab有什么區別_火花塞為什么一換就是4個?只換一個不行嗎?

火花塞不是一個經常被提及的配件&#xff0c;但如果火花塞老化&#xff0c;車輛的整體性能將受到影響&#xff0c;更換火花塞其實也是日常保養的一部分&#xff0c;就像換機油和三濾一樣。不知道大家是否注意到&#xff0c;在做完保養之后&#xff0c;維修師傅會幫你檢查一下火…

小型云臺用的是什么電機_直流電機的工作原理是什么?未來的電動車都會用直流電機嗎?...

說起直流電機&#xff0c;其實我們每個人&#xff0c;每天都在用。是嗎&#xff1f;別驚訝&#xff0c;是的。手機&#xff0c;我們每天都在用&#xff0c;有消息或者有電話時&#xff0c;手機就開始振動。這個振動就是用直流電機來實現的。當然&#xff0c;直流電機在其他領域…

C語言、C++學習路線

文章目錄C語言 C語言大綱 C語言知識點總結圖 C語言視頻推薦基礎篇進階篇速成篇基礎入門之游戲實戰篇C語言核心鏈表文檔教程視頻教程文件C語言實例C C大綱崗位分析 C與C 編程基礎四大件數據結構與算法計算機網絡操作系統設計模式C視頻推薦C語言 C語言大綱 C語言知識點總結圖 C語…

2020年日歷_2020年《故宮日歷》發布:濃縮紫禁城600年滄桑

2020年《故宮日歷》。中國網記者 劉維佳/攝中國網8月26日訊(記者 劉維佳) 2020年《故宮日歷》發布會今日在故宮博物院建福宮舉行。2020年為庚子鼠年&#xff0c;亦正值紫禁城建成六百周年&#xff0c;因此&#xff0c;2020年《故宮日歷》是為紀念紫禁城六百周年而特別呈現。故宮…

計算機二級(C語言)備考

文章目錄考試詳情一點建議公共基礎知識&#xff08;10分&#xff09;著重點資源視頻教程文檔練習題考試詳情 一、選擇題 40分 二、程序填空題 18分 三、程序修改題 18分 四、程序設計題 24分 考試時間&#xff1a;120分鐘 一點建議 多練習題目&#xff0c;多思考&#xff0c…

jav簡單的個人博客網站代碼_每個人都可以擁有的個人博客網站

題記------去過的地方越多&#xff0c;越知道自己想回到什么地方去&#xff01;雨又下了一夜&#xff0c;曾經多少次覺得下雨天是最適合睡覺的天氣。而最近的雨&#xff0c;總感覺有些嘈雜&#xff0c;總怕吵醒遠方睡夢中的星&#xff0c;晨。以至于翻來覆去睡不著。但是&#…

實用的編程網站—良好的開端

文章目錄在線編程網站編程資源網編程源碼網編程學習網在線編程網站 nyist_acm 領扣 力扣 洛谷 計蒜客 牛客網 藍橋杯ACM在線 HUSTOJ LiberOJ EduCoder PIPIOJ Codeabbey C語言網 hihocoder 賽碼網 編程資源網 搜云盤 IT視頻學習網 798資源網 Java知識分享網…

泰禾光電機器人研發_機器之眼 | 3D相機能讓機器人看見什么?

“中國制造2025”&#xff0c;其核心環節之一就是機器人智能化。視覺技術代表了機器的眼睛和大腦&#xff0c;機器視覺將使得機器人智能化變成現實。為了使機器人能夠勝任更復雜的工作&#xff0c;機器人不但要有更好的控制系統&#xff0c;還需要更多地感知環境的變化。機器人…