【數據庫學習筆記】Oracle_02_序列,分頁,常用函數,jdbc,PL/SQL

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偶數和



發佈了106 篇原創文章 · 獲贊 135 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章