##一、 oracle的簡介
###1. oracle數據庫的特點
持大數據量、多用戶的高性能的事務處理
Oracle遵守數據存取語言、操作系統、用戶接口和網絡通信協議的工業標准
實施安全性控制和完整性控制
支持分布式數據庫和分布處理
具有可移植性、可兼容性和可連接性
全球化、跨平台的數據庫
###2. oracle認證
初級(輔助認證OCA);
專業/中級(專業認證OCP)-資料費/考試費/培訓費萬元左右
大師/高級(專家級認證OCM)-中國大陸約千於人擁有OCM的認證/考試費約2000$,原廠培訓費約2000$。
##二、安裝數據庫
##三、簡單使用oracle數據庫
###1.了解Oracle服務器
Oracle服務器由兩大部分組成,Oracle數據庫和Oracle實例。
Oracle數據庫
Oracle數據庫:位於硬盤上實際存放數據的文件,這些文件組織在一起,成為一個邏輯整體,即為Oracle數據庫。
因此,在Oracle看來,數據庫是只硬盤上文件的集合,必須要與內存中的實例合作,才能對外提供數據管理服務。
Oracle實例
位於物理內存中的數據結構。它由一共享的內存池和多個后台進程組成,共享的內存池可以被所有的進程訪問,
用戶如果要存儲數據庫(也就是硬盤上的文件)里的數據,必須通過實例才能實現,不能直接讀取硬盤上的文件。
###oracle 體系結構
oracle物理結構 : 物理文件 控制文件、數據文件、日志文件(redo、undo)、參數文件
oracle邏輯結構 : 實例---->表空間--->段----->區------>塊
oracle內存結構 :SGA、PGA、UGA
###2.登錄
用戶名和密碼
管理員用戶:
用戶名sys(最大的權限)密碼在安裝時設置的密碼;還具有創建新的數據庫的權限。
用戶名system(次之)密碼在安裝時設置的密碼
普通用戶:
用戶名scott密碼hnqy
忘記密碼
控制台:sqlplus / as sysdba;
在以SYSDBA身份登陸時可以修改其他用戶的密碼
alter user user01 identified by user10;
連接字符串
通過網絡訪問遠端服務器上的數據庫時,用於描述數據庫訪問地址的字符串,
通常的結構是“主機名(或IP):端口號:服務名”,例如:jdbc:oracle:thin:@localhost:1521:orcl(SID)
###3.權限管理
在為一個Oracle數據庫系統創建用戶之后,這些用戶既不能與數據庫服務器連接,也不能做任何事情,除非他們具有執行特定數據庫操作的權限.
oracle內置權限:(SELECT * FROM SYSTEM_PRIVILEGE_MAP查);
Oracle中的數據庫訪問權限類型共有兩種:
系統權限: 允許用戶執行特定的數據庫動作,如創建表、創建索引、連接實例等
對象權限: 允許用戶操縱一些特定的對象,如讀取視圖,可更新某些列、執行存儲過程等
1)常用系統權限
CREATE SESSION 創建會話
CREATE SEQUENCE 創建序列
CREATE SYNONYM 創建同名對象
CREATE TABLE 在用戶模式中創建表
CREATE ANY TABLE 在任何模式中創建表
DROP TABLE 在用戶模式中刪除表
DROP ANY TABLE 在任何模式中刪除表
CREATE PROCEDURE 創建存儲過程
EXECUTE ANY PROCEDURE 執行任何模式的存儲過程
CREATE USER 創建用戶
DROP USER 刪除用戶
CREATE VIEW 創建視圖
使用系統權限
賦予權限語法:GRANT privilege [, privilege...] TO user [, user| role, PUBLIC...] [WITH ADMIN OPTION];
示例:分配權限
SQL> GRANT CREATE SESSION,CREATE TABLE,CREATE USER TO scott;
SQL> GRANT EXECUTE ANY PROCEDURE TO scott WITH ADMIN OPTION;
SQL> GRANT EXECUTE ANY PROCEDURE TO PUBLIC; --將EXECUTE ANY PROCEDURE授予所有用戶
示例:使用系統表
SQL> CREATE TABLE tb1 AS SELECT * FROM USER_TABLES;
SQL> CONN sys as sysdba;
SQL> ALTER USER robinson QUOTA 10M ON USERS;
SQL> CREATE TABLE tb1 AS SELECT * FROM USER_TABLES;
查看系統權限
dba_sys_privs --針對所有用戶被授予的系統權限
user_sys_privs --針對當前登陸用戶被授予的系統權限
回收系統權限語法:REVOKE {privilege | role} FROM {user_name | role_name | PUBLIC}
示例:回收執行存儲過程的權限
SQL> REVOKE EXECUTE ANY PROCEDURE FROM scott;
SQL> select grantee,privilege,admin_option from dba_sys_privs
2)對象權限
對象權限 表 視圖 序列 過程
修改(alter) √ √
刪除(delete) √ √
執行(execute) √
索引(index) √
插入(insert) √ √
關聯(references) √ √
選擇(select) √ √ √
更新(update) √ √
對象授權語法:
GRANT object_priv|ALL [(columns)]
ON object
TO {user|role|PUBLIC}
[WITH GRANT OPTION];
ALL:所有對象權限
PUBLIC:授給所有的用戶
WITH GRANT OPTION:允許用戶再次給其它用戶授權
示例:
SQL> GRANT SELECT ON emp TO robinson;
SQL> GRANT UPDATE(sal,mgr) ON emp TO robinson WITH GRANT OPTION;
SQL> GRANT SELECT ON dept TO PUBLIC;
USER_SYS_PRIVS 用戶擁有的系統權限
USER_TAB_PRIVS 用戶擁有的對象權限
回收對象權限語法:
REVOKE {privilege [, privilege...]|ALL}
ON object
FROM {user[, user...]|role|PUBLIC}
[CASCADE CONSTRAINTS];
###4.PL/SQLDeveloper工具的使用
##四、查詢中常用的函數
1.字符函數
大小寫轉換函數
LOWER (strexp) 返回字符串,並將所有的字符小寫
UPPER (strexp) 返回字符串,並將所有的字符大寫
INITCAP(strexp) 將字符串的(每個單詞的)第一個字母變為大寫,后面的小寫;
字符處理函數
1、CONCAT(strexp, strexp): 連接兩個字符串
2、Substr(str,start_index,length) 從指定的位置截取指定長度的字符串
3、LENGTH(strexp):返回字符串的長度
4、LPAD( string1, padded_length, [ pad_string ] ) 在列的左邊粘貼字符
其中string1是需要粘貼字符的字符串
padded_length是返回的字符串的數量,如果這個數量比原字符串的長度要短,lpad函數將會把字符串截取成padded_length;
pad_string是個可選參數,這個字符串是要粘貼到string1的左邊,如果這個參數未寫,lpad函數將會在string1的左邊粘貼空格。
5、RPAD(粘貼字符) RPAD 在列的右邊粘貼字符
6、Trim():截取字符串兩端特殊字符
Trim('s' from 'string');可以指定從字符串兩邊要截取的特殊字符
2.數字函數
Round:傳回一個數值,該數值是按照指定的小數位數進行四舍五入運算的結果。
ROUND( number, decimal_places )
number : 需四舍五入處理的數值,
decimal_places : 四舍五入 , 小數取幾位 ( 預設為 0 )
ROUND(45.926, 2) 45.93
TRUNC函數返回處理后的數值,其工作機制與ROUND函數極為類似,只是該函數不對指定小數前或后的部分做相應舍入選擇處理,而統統截去。
TRUNC(45.926, 2) 45.92
mod(number1,number2)兩個數值相除並返回其余數。運算符執行 number1 除以 number2 操作
MOD(1600, 300)
3.轉換函數
隱含的類型轉換
顯式的類型轉換

顯式的類型轉換
TO_CHAR函數處理數字
TO_CHAR(number, ‘fmt’):是字符類型的函數,轉化數字為字符
使用TO_CHAR函數將數字作為字符顯示
數字格式控制符 描述
9 代表一位數字,如果當前位有數字,顯示數字,否則不顯示(小數部分仍然會強制顯示)
0 強制顯示該位,如果當前位有數字,顯示數字,否則顯示0
$ 增加美元符號顯示
L 增加本地貨幣符號顯示
. 小數點符號
, 千分位符號 3,000,000,000.00
TO_NUMBER函數
使用TO_NUMBER函數將字符轉換為數字
TO_NUMBER(char [, 'fmt']))
TO_CHAR 函數操作日期
TO_CHAR(date, ‘fmt’) :是字符類型的函數,轉化日期為字符
格式(‘fmt’)
1、必須用單引號括起來,並且是大小寫敏感
2、可包含任何有效的日期格式
3、fmt值的寬度正好能容納所有的有效數字
格式控制符 描述
YYYY YYY YY 以數字表示全年(分別代表4位、三位、兩位)的數字年
YEAR 年的拼寫
MM(mm) 兩位數字月
MONTH 月的全拼
MON 月名稱的縮寫
DD 數字日
DAY 星期的全拼
D 星期中的第幾天
DY 表示三位縮寫的星期
TO_DATE函數
使用TO_DATE函數將字符轉換為日期
TO_DATE(char [, 'fmt']))
格式控制符 描述
HH,HH12 一天中的第幾個小時,12進制表示法
HH24 一天中的第幾個小時,取值為00~23
MI 一小時中的分鍾
SS 一分鍾中的秒
AM 顯示上午或下午
4.日期函數
add_months(date_value,number_of_months):用於從一個日期值增加或減少一些月份
select add_months(sysdate,12) "明年今日" from dual;
select add_months(sysdate,-12) "去年今日" from dual;
current_date:返回當前會話時區中的當前日期
select sessiontimezone,current_date from dual;
alter session set time_zone='-11:00'//修改當前會話時區
extract(date_field from datetime_value):找出日期或間隔值的字段值
select extract(month from sysdate) "當前月份" from dual;
last_day(date_value):返回指定日期中的月份的最后一天的日期
select last_day('2000-02-01') "潤月" from dual;
next_day( date, weekday ):返回指定時間的下一個星期的指定星期對應的日期
select next_day(sysdate,'星期一') from dual;
months_between(f,s) 日期f和s間相差月數
select months_between(sysdate,'04-5月-09')from dual;
5.其他函數
NVL 函數
NVL(expr1,expr2)將空值轉換為替換的值
支持多種數據格式可以是日期,字符,數字
NVL的兩個參數數據類型必須匹配 ,否則出錯。
示例:
NVL(comm,0)
NVL(hiredate,'01-JAN-97')
NVL(job,'No Job Yet')
select NVL(null,'01-JAN-97') from dual
NVL2函數
NVL2(expr0,expr1,expr2)
如果expr0不為Null,返回expr1, 為Null,返回expr2.
expr0可以為任何數據類型
NULLIF函數
NULLIF(expr1,expr2)
比較兩個表達式,如果相等返回空值,如果不等返回第一個表達式。
SELECT first_name, LENGTH(first_name) "expr1",
last_name, LENGTH(last_name) "expr2",
NULLIF(LENGTH(first_name),
LENGTH(last_name)) result
FROM employees;
6.嵌套函數
單行函數可被嵌入到任何層
在嵌套的時候,最內層的函數最先被執行,執行的結果被傳遞到它的上層函數,作為參數使用,然后依次從內向外執行,直到所有的函數執行完。
##五、dual表
Oracle提供的最小的工作表,只有一行一列,具有某些特殊功用途
Oracle提供的最小的表,不論進行何種操作(不要刪除記錄),它都只有一條記錄——'X'。
例如:執行select * from dual,里面只有一條記錄;執行insert into dual values('Y')后,再次查詢dual表,仍然顯示一條記錄。
是sys用戶下的一張內部表,所有用戶都可以使用DUAL名稱訪問,無論什么時候這個表總是存在。
例如:執行一個查看當前日期的語句 select sysdate from dual,這條語句在放在放在任何一個oracle數據庫當中都不會報錯,
所以一般做一些特定查詢的時候用這個表是最穩妥的。
常見用途:
查看當前用戶
select user from dual;
用做計算器
select 7*9*10-10 from dual;
調用系統函數
獲得當前系統時間
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
獲得主機名
select sys_context('userenv','terminal') from dual;
獲得當前locale
select sys_context('userenv','language') from dual;
獲得一個隨機數
select DBMS_RANDOM.random from dual;
查看序列值
創建序列aaa 以1開始,每次加1
create sequence aaa increment by 1 start with 1;
獲得序列aaa 的下一個序列值
select aaa.nextval from dual;
獲得序列aaa 的當前序列值
select aaa.currval from dual;
##六、序列
1.了解序列:
是一數據庫對象,利用它可生成唯一的整數。
一般使用序列自動地生成表主鍵值或唯一鍵值,不直接連接到數據庫中的任何表
2.創建序列語法
CREATE SEQUENCE [user.]sequence_name
[increment by n]
[start with n]
[maxvalue n|]
[minvalue n ];
[cache]
[NOCYCLE|CYCLE]
INCREMENT BY: 指定序列號之間的間隔,該值可為正的或負的整數,但不可為0。序列為升序。忽略該子句時,缺省值為1。
START WITH:指定生成的第一個序列號。在升序時,序列可從比最小值大的值開始,缺省值為序列的最小值。
對於降序,序列可由比最大值小的值開始,缺省值為序列的最大值。
MAXVALUE:指定序列可生成的最大值。
MINVALUE:指定序列的最小值
NOCYCLE:一直累加,不循環
CYCLE:累加到最大值循環
cache:默認值是20
序列里的緩沖是大量並發提取序列值時提升性能的一種手段 ,由於序列操作是原子操作,如果沒有緩沖,序列的訪問將只能由一個事務獨占,
獨占期間阻塞其它事務的訪問,且一定會涉及硬盤操作。這樣如果有對一個序列的大量並發操作的話,系統性能將會下降。
緩沖是指事先成批的提取序列值,緩沖在內存中,供多個事務同時訪問(每個事務占一個緩沖的序列值),且訪問期間如果沒有用盡緩沖是不用寫硬盤的,可在大幅度提高並發訪問序列的性能。
但帶來的問題是序列值可能不連續(但肯定保證唯一),如並發訪問序列值后有些事務回滾等操作,都會帶來緩沖序列值的不連續或丟失。
3.創建序列
create sequence emp_seq
increment by 1
start with 1
minvalue 1
maxvalue 9999
4.查看用戶定義的序列
select t.sequence_name,t.min_value,t.max_value,
t.increment_by from user_sequences t
5.使用序列
--currval :返回序列的當前值
--nextval 返回序列首次引用時的起始值,以后使用nextval的引用將使用increment by 子句增加序列值,並返回新值
查看某序列的值
select emp_seq.currval from dual
使用序列
select emp_seq.nextval from dual
使用序列示例:
insert into emplouees(employees_id,last_name….) values(emp_seq.nextval,’zhang’……)
alter sequence emp_seq increment by 2 minvalue 3 maxvalue 99999
drop sequence emp_seq
##七、plsql
1.什么是PL/SQL
PL/SQL是Oracle數據庫對SQL語句的擴展,增加了編程語言的特點.
數據操作和查詢語句被包含在PL/SQL代碼的過程性單元中,經過邏輯判斷、循環等操作完成復雜的功能或者計算
2.PL/SQL的優點
使一組語句功能形成模塊化程序開發
使用過程性語言控制程序結構
可以對程序中的錯誤進行處理
集成在數據庫中
有助於提高程序性能
3.PL/SQL塊的基本結構
DECLARE – 可選部分
變量、常量以及類型等
BEGIN – 必要部分
SQL語句
PL/SQL語句
EXCEPTION – 可選部分
程序出現異常時,捕捉異常並處理異常
END; – 必要部分
4.PL/SQL塊例子:
示例1:
DECLARE
v_dept_id employees.department_id%TYPE;
BEGIN
SELECT department_id INTO v_dept_id FROM employees WHERE employee_id = 100;
DELETE from departments WHERE department_id = v_dept_id;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
INSERT INTO exception_table (message) VALUES ('Some error occurred in the database.');
COMMIT;
END;
------------------------------------------------------------------------------
DECLARE
v_dept_id emp.deptno%TYPE;
BEGIN
SELECT deptno INTO v_dept_id FROM emp WHERE empno = 100;
DELETE from dept WHERE deptno = v_dept_id;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
INSERT INTO exception_table (message) VALUES ('Some error occurred in the database.');
COMMIT;
END;
----------------------------------------------------------------------------------
示例2:
begin
dbms_output.put_line('hello world');--調用dbms_output包中的put_line函數來輸出內容
end;
注意,如果在sqlplus中,需要執行set serveroutput on來開啟顯示結果
5.pl/sql中執行的命令
在PL/SQL程序塊中可以使用各種SQL命令,但是使用的方法根據命令不同也各不相同
使用SELECT 命令,可以從數據庫中取出單行數據
使用DML命令,修改數據庫中的行
使用COMMIT 或ROLLBACK 命令控制事務
通過EXECUTE IMMEDIATE,執行DDL和DCL語句
##八、函數和存儲過程
###1.函數
函數用來執行復雜的計算,並返回計算的結果
語法結構:
create or replace FUNCTION funname [(parameter,...)]
RETURN datatype
IS
begin
pl/sql_block;
end funname ;
創建一個PL/SQL函數,只返回計算的結果值,函數不能像存儲過程那樣,對數據庫進行操作。
只能使用in模式參數傳入參數值
在函數的聲明中,必須包括一個帶有數據類型的RETURN 子句,表示函數計算后的最終返回函數的結果類型。
在PL/SQL塊中至少包括一個有效的RETURN語句,以便返回函數的最終計算結果。
好處:
可以實現用簡單的SQL語句不能實現的計算
提高查詢的效率
使用規則:
只能使用函數,而不是過程
函數中不允許DML語句
形參必須為IN
必須返回Oracle支持數據類型,不能使用PL/SQL數據類型
必須有EXECUTE權限
###2.存儲過程
用於在數據庫中完成特定的操作或者任務
create or replace PROCEDURE name
[(parameter,...)]
IS
--聲明變量
BEGIN
pl/sql_block;
EXCEPTION
…………….
END;
parameter的語法如下:
parameter_name [IN | OUT | IN OUT] datatype
[{:= | DEFAULT} expr]
示例:
插入數據的存儲過程,參數有外部傳入
create or replace procedure insertdeptproc(v_deptno IN number, v_dname IN varchar2, v_loc IN varchar2)
is
begin
insert into dept(deptno,dname,loc) values(v_deptno,v_dname,v_loc);
commit;
end;
oracle cmd 命令窗口中:exec insertproce(77, ‘行政部’,’北京’);
jdbc中調用 call insertproce(77, ‘行政部’,’北京’);
##九、分頁查詢
select * from
(
select emp.*,rownum rn
from emp
where rownum<=10
)
where rn>=5;
分頁查詢格式1
在查詢的最外層控制分頁的最小值和最大值。查詢語句如下:
SELECT * FROM
(
SELECT A.*, ROWNUM RN
FROM A
)
WHERE RN BETWEEN 21 AND 40
分頁查詢格式2
SELECT * FROM
(
SELECT A.*, ROWNUM RN
FROM A
WHERE ROWNUM <= 40
)
WHERE RN >= 21