Oracle_02
A.序列
1.sequence序列
是oracle提供的用於產生一系列唯一數字的數據庫對象
oracle沒有自增長,因此就要使用序列
主要用於提供主鍵值,將序列值裝入內存可以提高訪問效率2.創建序列
要有創建序列的權限 create sequence 或 create any sequence
語法:
a.CREATE SEQUENCE sequence
創建序列名稱
b.[INCREMENT BY n]
遞增的序列值是n,如果n是正數就遞增
如果是負數就遞減,默認是1
c.[START WITH n]
開始的值,遞增默認是minvalue,遞減是maxvalue
d.[{MAXVALUE n | NOMAXVALUE}] 最大值
e.[{MINVALUE n | NOMINVALUE}] 最小值
f.[{CYCLE | NOCYCLE}] 循環/不循環
g.[{CACHE n | NOCACHE}] 分配並存入到內存中
先創建一個表
查看錶
創建序列
3.使用序列
一旦定義了某個序列,可以使用currval,nextval獲取值
currval: 返回sequence的當前值
nextval: 返回sequence的下一個值
問題:我是從1開始,但實際上確從2開始
11.2.0.1版本開始,提供了一個延遲段創建特性
當我們創建了新表和序列,在插入語句時
序列會跳高第一個值
解決方法:更改數據庫延遲段創建特性爲false(用最高權限)
注意事項
a.currval總是返回當前sequence的值,只有在第一次nextval初始化後,才能使用currval,否則會出錯
b.每使用一次nextval,就會增加一次sequence的值,同一個語句裏面要是有多個nextval,其數值就是不一樣的
c.第一次nextval返回的值是初始值:隨後的nextval會自動增加定義的increment by值,然後返回增加後的值
d.如果指定cache值,oracle就可以預先在內存裏面放置一些sequence,這樣存取會更快,cache裏面取完後,oracle自動再取一組到cache
e使用cache或許會跳號,比如數據庫突然不正常down掉,cache中的sequence就會丟失,可以在定義sequence的時候,使用nocache防止這種情況
4.使用觸發器實現自增長
如果每次都要插入seq.nextval的值會非常累贅與麻煩
因此可以考慮使用觸發器來完成這一步工作
dual表是oracle內部提供的臨時數據計算的特殊表
添加數據
此時,id是從1開始
B.分頁
1.概述
Oracle中的表,除了建表時的各個字段,還有兩個字段
分別是ROWID(行標示符)和ROWNUM(行號)
使用DESC查看錶的結構,也是看不到這兩個列
只在數據庫內部使用的,所以也通常稱他們爲僞列(pseudo column)
rowid我們一般用不到,Oracle數據庫內部使用它來存儲行的物理位置
而使用rownum來進行分頁查詢的,它的值表示行號
2.實現
準備
每頁展示三條select t1.* from ( -- t1爲中間表 select info.*, rownum rn from info) t1 -- 將行號和所有數據放到一箇中間表上 where rn between pageSize*(curPage-1)+1 -- 當頁第一條 and pageSize*curPage -- 當頁最後一條
C.常用函數
1.字符類函數
a.CONCAT(X,Y)
連接字符串X和Y
b.LENGTH(X)
返回X的長度
c.SUBSTR(X,start[,length])
返回X的子字串,從start處開始,截取length個字符
缺省length,默認到結尾
d.LTRIM(X[,TRIM_STR])
把X的左邊截去trim_str字符串,缺省截去空格
e.RTRIM(X[,TRIM_STR])
把X的右邊截去trim_str字符串
2.數字函數
接受數字參數,參數可以來自表中的一列,也可以是一個數字表達式
a.ABS(X) X的絕對值
b.CEIL(X) 大於或等於X的最小整數值
c.FLOOR(X) 小於或等於X的最大整數值
d.ROUND(X[,Y]) X在第Y位四捨五入
e.POWER(X,Y) X的Y次冪
3.日期函數
對日期進行運算
a.ADD_MONTHS(d,n)
在某一個日期 d 上,加上指定的月數 n,返回計算後的新日期
d 表示日期,n 表示加的月數
b.LAST_DAY(d)
返回指定日期當月的最後一天
c.EXTRACT(fmt FROM d)
提取日期中的特定部分
fmt 爲:YEAR、DAY等。
其中 YEAR、MONTH、DAY可以爲 DATE 類型匹配
也可以與 TIMESTAMP 類型匹配
但是 HOUR、MINUTE、SECOND 必須與 TIMESTAMP 類型匹配
4.轉換函數
a.TO_CHAR(d|n[,fmt])
把日期和數字轉換爲制定格式的字符串。Fmt是格式串
b.TO_DATE(X,[,fmt])
把一個字符串以fmt格式轉換成一個日期類型
c.TO_NUMBER(X,[,fmt])
把一個字符串以fmt格式轉換爲一個數字
5.其他單行函數
a.NVL(X,VALUE)
如果X爲空,返回value,否則返回X
b.NVL2(x,value1,value2)
如果x非空,返回value1,否則返回value2
D.JDBC連接oracle(與mysql相同)
1.下載oracle驅動jar
2.拷貝到web應用的WEB-INF下lib目錄
3.配置對應的驅動類 url user password等
url:jdbc:oracle:thin:@localhost:1521:orcl
4.使用jdbc方式登錄操作
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.List; import java.util.Map; public class Test { public static void main(String[] args) { try { Class.forName("oracle.jdbc.OracleDriver"); Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "scott", "123456"); Statement stmt = conn.createStatement(); String sql = "select * from emp"; List<Map<String,Object>> list = DbUtils.getResult(sql); System.out.println(list); } catch (ClassNotFoundException e) { System.out.println("驅動類有誤:" + e); } catch (Exception e) { System.out.println("sql有誤:" + e); } } }
5.還可以用c3p0
E.PL/SQL
1.概述
Oracle PL/SQL語言(Procedural Language/SQL)
是結合了結構化查詢和Oracle自身過程控制爲一體的強大語言
PL/SQL不但支持更多的數據類型,擁有自身的變量申明,賦值語句
而且還有條件,循環等流程控制語句
過程控制結構與SQL數據處理能力無縫的結合形成了強大的編程語言
可以創建過程和函數以及程序包
2.特點
PL/SQL是一種塊結構的語言,它將一組語句放在一個塊中
一次性的發送給服務器,由服務器和自身引擎兩個執行器執行代碼
3.有點
a.支持SQL
SQL是訪問數據庫的標準語言,通過SQL命令,用戶可以操縱數據庫的數據
PL/SQL支持所有的SQL數據操縱命令、遊標控制命令
事務控制命令、SQL函數、運算符和僞列。
同時PL/SQL和SQL語言緊密集成
PL/SQL支持所有的SQL數據類型和NULL值
b.支持面向對象編程
PL/SQL支持面向對象的編程,在PL/SQL中可以創建類型
可以對類型進行繼承,可以在子程序中重載方法等
c.更好的性能
SQL是非過程語言,只能一條一條的執行
而PL/SQL把一個PL/SQL統一進行編譯後執行
同時還可以把編譯好的PL/SQL塊存儲起來,以備重用
減少了應用程序和服務器之間的通信時間,所以PL/SQL是高效而快速的
d.可移植性
使用PL/SQL編寫的應用程序語言
可以移植到任何操作平臺的ORACLE服務器
同時還可以編寫可移植程序庫,在不同環境中使用
e.安全性
可以通過存儲過程對客戶機和服務器之間的應用程序邏輯進行分割
這樣可以限制對ORACLE數據庫的訪問
數據庫還可以授權和撤銷其他用戶的訪問權利
4.基本語法
PL/SQL是一種塊結構的語言
一個PL/SQL包含了一個或多個邏輯塊
邏輯塊中可以聲明變量、寫程序主體、還可以捕獲異常和異常處理
每個邏輯塊分爲三個部分
[DECLARE]
-- 變量或常量或遊標聲明。可選。
BEGIN--執行部分。主要的邏輯和控制運算均在此實現
以BEGIN開始,END(加;號)結束。必選
[EXCEPTION]
--異常處理部分。可選。作用和java中異常一樣
END;
5.注意事項
a.LP/SQL是一種編程語言,有自己獨有的數據類型,變量聲明和賦值以及流程控制語句
b.對大小寫不敏感,但是爲了規範:關鍵字全部大寫,其餘部分小寫
c.每一條語句以分號結束
6.設置服務端顯示執行結果
否則不打印結果,設置一次即可
7.求兩個數商
8.PL/SQL字符集
所有的PL/SQL程序元素(如關鍵字 變量名 常量名)中可以使用的合法字符集
大寫和小寫字母
數字
非顯示的字符:製表符 空格 回車
數學符號:+ - * / ><=等
間隔符:() {} [] ? ! ; : @ # % $ &等
9.常用數據類型
a.基本數據類型
數值類型
包括NUMBER,PLS_INTEGER,BINARY_INTEGER
等3種基本類型,前者可存儲整數或浮點數
後兩個只能存儲整數
爲與其他編程語言數據類型的兼容
也可使用子類型(即別名)表示NUMBER類型:DEC DECIMAL DOUBLE INTEGER INT NUMERIC SMALLINT PLS_等
可使用NUMBER(P,S)來格式化數字
p代表精度即有效數據個數,S代表刻度範圍即小數點後有效位數
b.字符類型
包括VARCHAR2 CHAR LONG NCHAR NVARCHAR2等
1)VARCHAR2
和數據庫中VARCHAR2類似,存儲可變長字符串
無默認長度,故必須給出最大長度參數,不能超過32767字節
2)CHAR類型
存儲定長字符串,不足空格補全,最大3767字節
默認長度爲1字節
3))LONG類型
可變字符串,最大長度32767字節
數據庫中LONG最大2GB,所以可以給數據庫中LONG字段賦值
c.日期類型
DATE類型:存儲日期和時間信息
存儲空間7字節,分別使用一個字節存儲世紀 年 月 日 小時 分 秒
d.布爾類型
BOOLEAN類型:用於程序的流程控制和業務邏輯判斷
值可以是TRUE FALSE NULL值之一
e.特殊數據類型
1)%TYPE類型
聲明與指定列相同的數據類型,通常緊跟在指定列名後面
可以不查看列類型確定變量類型
已有列改變數據類型則變量類型同步改變
SCOTT模式下使用
%type類型輸出emp表中編號爲7396員工的名字和職務信息
2)RECORD記錄類型
可以存儲多個列值組成的一行數據
但在聲明記錄類型變量前,必須定義記錄類型
然後才聲明記錄類型的變量
記錄類型是一種結構化的數據類型
使用TYPE定義,包含 成員變量和數據類型
語法格式:
type record_type is record(
var_member1 data_type [not null] [:=default_value],
......
var_membern data_type [not null] [:=default_value]
)
其中record_type是記錄類型
var_member1表示變量名稱
data_type表示變量類型
3)%ROWTYPE類型
結合了%TYPE和RECORD記錄類型的優點
可以根據數據庫中一行的結構定義一個類型
存儲檢索到的一行記錄
rowVar_name table_name%rowtype;
rowVar_name變量名
table_name指定表名
10.流程控制語句
a.選擇語句:條件語句
b.if..then...else雙條件
c.if...then...elsif多條件語句
d.case語句
與if...then...elsif相似
在case後面有一個選擇器,通常是變量,接着是when子句
後面緊跟表達式,選擇器值和表達式值匹配
11.循環控制語句
a.loop語句
計算1-100的和
b.while語句
c.for語句
求1-100偶數和