1. 程式人生 > >Oracle基礎知識總結

Oracle基礎知識總結

ORACLE 基礎

ORACLE 資料庫具有以下特點:
  • 支援多使用者、大事務量的事務處理
  • 資料安全性和完整性控制
  • 支援分散式資料處理
  • 可移植性
ORACLE 體系結構
  • 資料庫
  • 例項
  • 資料檔案(dbf)
  • 表空間 -使用者

在這裡插入圖片描述 這是Oracle的整體結構圖

建立表空間
create tablespace waterboss
datafile 'c:\waterboss.dbf'
size 100m
autoextend on
next 10m

waterboss 為表空間名稱
datafile 用於設定物理檔名稱
size 用於設定表空間的初始大小
autoextend on 用於設定自動增長,如果儲存量超過初始大小,則開始自動擴容
next 用於設定擴容的空間大小
建立使用者
create user wateruser
identified by itcast
default tablespace waterboss

wateruser 為建立的使用者名稱
identified by 用於設定使用者的密碼
default tablesapce 用於指定預設表空間名稱
使用者賦權
grant dba to wateruser

表的建立、修改與刪除

建立表
CREATE TABLE 表名稱(
欄位名 型別(長度) primary key,
欄位名 型別(長度),
.......
);
資料型別:
  • 字元型
  1. CHAR : 固定長度的字元型別,最多儲存 2000 個位元組
  2. VARCHAR2 :可變長度的字元型別,最多儲存 4000 個位元組
  3. LONG : 大文字型別。最大可以儲存 2 個 G
  • 數值型

NUMBER : 數值型別

例如:NUMBER(5) 最大可以存的數為 99999

NUMBER(5,2) 最大可以存的數為 999.99

  • 日期型
  1. DATE:日期時間型,精確到秒

  2. TIMESTAMP:精確到秒的小數點後 9 位

  • 二進位制型(大資料型別)
  1. CLOB : 儲存字元,最大可以存 4 個 G
  2. BLOB:儲存影象、聲音、視訊等二進位制資料,最多可以存 4 個 G
修改表
  1. 增加欄位

ALTER TABLE 表名稱 ADD(列名 1 型別 [DEFAULT 預設值],列名 1 型別 [DEFAULT 預設值]…)

  1. 修改欄位

ALTER TABLE 表名稱 MODIFY(列名 1 型別 [DEFAULT 預設值],列名 1 型別 [DEFAULT 預設值]…)

  1. 修改欄位名

ALTER TABLE 表名稱 RENAME COLUMN 原列名 TO 新列名

  1. 刪除欄位名

ALTER TABLE T_OWNERS DROP COLUMN REMARK

刪除表

drop table 表名稱

資料增刪改
  • INSERT INTO 表名[(列名 1,列名 2,…)]VALUES(值 1,值2,…)
  • UPDATE 表名 SET 列名 1=值 1,列名 2=值 2,…WHERE 修改條件;
  • DELETE FROM 表名 WHERE 刪除條件;
  • TRUNCATE TABLE 表名稱 ---- 刪除表
比較 truncat 與 delete 實現資料刪除?
  1. delete 刪除的資料可以 rollback
  2. delete 刪除可能產生碎片,並且不釋放空間
  3. truncate 是先摧毀表結構,再重構表結構
JDBC 連線 ORACLE

//載入驅動

static{
	try {
		Class.forName("oracle.jdbc.driver.OracleDriver");	Class.forName("oracle.jdbc.driver.OracleDriver");
	} catch (ClassNotFoundException e) {
		e.printStackTrace();	e.printStackTrace();
	}
}


// 獲取資料庫連線
public static java.sql.Connection getConnection() throwsSQLException{
    return java.sql.DriverManager.getConnection("jdbc:oracle:thin:@192.168.80.10:1521:orcl","wateruser", "itcast");
}
  • JDBC 驅動為:

oracle.jdbc.OracleDriver

  • 連線字串( 瘦連線 ):

jdbc:oracle:thin:@虛擬機器的 IP:1521:orcl

資料匯出與匯入

整庫匯出與匯入
  • 整庫匯出命令

exp system/itcast full=y 或者 exp system/itcast file=檔名 full=y

  • 整庫匯入命令

imp system/itcast full=y or imp system/itcast full=y file=water.dm

按使用者匯出與匯入
  • 按使用者匯出

exp system/itcast owner=wateruser file=wateruser.dmp

  • 按使用者匯入

imp system/itcast file=wateruser.dmp fromuser=wateruser

按表匯出與匯入
  • 按表匯出 exp wateruser/itcast file=a.dmp tables=t_account,a_area
  • 按表匯入 imp wateruser/itcast file=a.dmp tables=t_account,a_are

ORACLE 查詢

單表查詢

簡單條件查詢
  • 精確查詢 select * from T_OWNERS where watermeter=‘30408’
  • 模糊查詢 select * from t_owners where name like ‘%劉%’
  • and 運算子 select * from t_owners where name like ‘%劉%’ and housenumber like ‘%5%’
  • or 運算子 select * from t_owners where name like ‘%劉%’ or housenumber like ‘%5%’
  • and 與 or 運算子混合使用 select * from t_owners where (name like ‘%劉%’ or housenumber like ‘%5%’) and addressid=3
  • 範圍查詢 select * from T_ACCOUNT where usenum>=10000 and usenum<=20000
  • 空值查詢 select * from T_PRICETABLE t where maxnum is null
去掉重複記錄
  • select distinct addressid from T_OWNERS
排序查詢
  • 升序排序 select * from T_ACCOUNT order by usenum
  • 降序排序 select * from T_ACCOUNT order by usenum desc
基於偽列的查詢
  • ROWID 具體某一行資料的實體地址 select rowID,t.* from T_AREA t
  • ROWNUM 每一行的行號,查詢後才會標註 select rownum,t.* from T_OWNERTYPE t
聚合統計
  • 聚合函式
  1. sum* select sum(usenum) from t_account where year=‘2012’

  2. avg* select avg(usenum) from T_ACCOUNT where year=‘2012’

  3. max* select max(usenum) from T_ACCOUNT where year=‘2012’

  4. select* min(usenum) from T_ACCOUNT where year=‘2012’

  5. count* select count(*) from T_OWNERS t where ownertypeid=1

  • 分組聚合 Group by* select areaid,sum(money) from t_account group by areaid
  • 分組後條件查詢 having* select areaid,sum(money) from t_account group by areaid having sum(money)>169000

連線查詢

多表內連線查詢
  • 查詢顯示業主編號,業主名稱,業主型別名稱

    select o.id 業主編號,o.name 業主名稱,ot.name 業主型別
    from T_OWNERS o,T_OWNERTYPE ot
    where o.ownertypeid=ot.id
    
  • 查詢顯示業主編號,業主名稱、地址和業主型別

     select o.id 業主編號,o.name 業主名稱,ad.name 地址,
     ot.name 業主型別
     from T_OWNERS o,T_OWNERTYPE ot,T_ADDRESS ad
     where o.ownertypeid=ot.id and o.addressid=ad.id
    
  • 查詢顯示業主編號、業主名稱、地址、所屬區域、業主分類

     select o.id 業主編號,o.name 業主名稱,ar.name 區域, ad.name 地址, ot.name 業主型別
      from T_OWNERS o ,T_OWNERTYPE ot,T_ADDRESS ad,T_AREA ar
    where o.ownertypeid=ot.id and o.addressid=ad.id and
     ad.areaid=ar.id
    
  • 查詢顯示業主編號、業主名稱、地址、所屬區域、收費員、業主分類

select ow.id 業主編號,ow.name 業主名稱,ad.name 地址,
ar.name 所屬區域,op.name 收費員, ot.name 業主型別
from T_OWNERS ow,T_OWNERTYPE ot,T_ADDRESS ad ,
T_AREA ar,T_OPERATOR op
where ow.ownertypeid=ot.id and ow.addressid=ad.id
and ad.areaid=ar.id and ad.operatorid=op.id
左外連線查詢
  • 查詢業主的賬務記錄,顯示業主編號、名稱、年、月、金額。如果此業主沒有賬務記錄也要列出姓名 SQL1999標準:
SELECT ow.id,ow.name,ac.year ,ac.month,ac.money
FROM T_OWNERS ow left join T_ACCOUNT ac
on ow.id=ac.owneruuid

Oracle語法:

SELECT ow.id,ow.name,ac.year ,ac.month,ac.money FROM
T_OWNERS ow,T_ACCOUNT ac
WHERE ow.id=ac.owneruuid(+)
右外連線查詢
  • 查詢業主的賬務記錄,顯示業主編號、名稱、年、月、金額。如果賬務記錄沒有對應的業主資訊,也要列出記錄 SQL1999標準:
select ow.id,ow.name,ac.year,ac.month,ac.money from
T_OWNERS ow right join T_ACCOUNT ac
on ow.id=ac.owneruuid

Oracle語法: s

elect ow.id,ow.name,ac.year,ac.month,ac.money from
T_OWNERS ow , T_ACCOUNT ac
where ow.id(+) =ac.owneruuid

子查詢

where 子句中的子查詢
  • 單行子查詢: 只返回一條記錄 / 單行操作符(= <> < <= > >=) 查詢 2012 年 1 月用水量大於平均值的臺賬記錄
select * from T_ACCOUNT
where year='2012' and month='01' and usenum> ( select avg(usenum) from T_ACCOUNT where year='2012' and month='01' )
  • 多行子查詢: 返回了多條記錄 多行操作符(in any all) in 運算子
select * from T_OWNERS where addressid in ( 1,3,4 )
select * from T_OWNERS where addressid in ( select id from t_address where name like '%花園%' )
select * from T_OWNERS where addressid not in ( select id from t_address where name like '%花園%' )
from 子句中的子查詢
  • 查詢顯示業主編號,業主名稱,業主型別名稱,條件為業主型別為”居民”,使用子查詢實現。
select * from
(select o.id 業主編號,o.name 業主名稱,ot.name 業主型別 from T_OWNERS o,T_OWNERTYPE ot where o.ownertypeid=ot.id)
where 業主型別='居民'
select 子句中的子查詢 ? select 子句的子查詢必須為單行子查詢
  • 列出業主資訊,包括 ID,名稱,所屬地址,所屬區域。

    select id,name,
    ( select name from t_address where id=addressid )addressname,( select (select name from t_area where id=areaid ) fromt_address where id=addressid ) adrename 
    from t_owners;
    

分頁查詢

簡單分頁
* select rownum,t.* from T_ACCOUNT t where rownum<=10
* select * from (select rownum r,t.* from T_ACCOUNT t where rownum<=20) where r>10
基於排序的分頁
* select * from (select rownum r,t.* from T_ACCOUNT t where rownum<=20 order by usenum desc) where r>10 !
* select rownum r,t.* from T_ACCOUNT t where rownum<=20 order by usenum desc !
* select * from (select rownum r,t.* from (select * from T_ACCOUNT order by usenum desc) t where rownum<=20 ) where r>10     $

單行函式

字元函式
  • 求字串長度 LENGTH select length(‘ABCD’) from dual;
  • 求字串的子串 SUBSTR select substr(‘ABCD’,2,2) from dual;
  • 字串拼接 CONCAT select concat(‘ABC’,‘D’) from dual; 或者 select ‘ABC’||‘D’ from dual;
數值函式
  • 四捨五入函式 ROUND select round(100.567) from dual 或者 select round(100.567,2) from dual
  • 擷取函式 TRUNC select trunc(100.567) from dual 或者 select trunc(100.567,2) from dual
  • 取模 MOD select mod(10,3) from dual
日期函式
  • 當前日期和時間 select sysdate from dual
  • 加月函式 ADD_MONTHS select add_months(sysdate,2) from dual
  • 求所在月最後一天 LAST_DAY select last_day(sysdate) from dual
  • 日期擷取 TRUNC select TRUNC(sysdate) from dual
select TRUNC(sysdate,'yyyy') from dual
select TRUNC(sysdate,'mm') from dual
轉換函式
* 數字轉字串 TO_CHAR  .....select TO_CHAR(1024) from dual
* 日期轉字串 TO_CHAR....select TO_CHAR(sysdate,'yyyy-mm-dd') from dual
                         select TO_CHAR(sysdate,'yyyy-mm-dd hh:mi:ss') from dual
*  字串轉日期 TO_DATE select TO_DATE('2017-01-01','yyyy-mm-dd') from dual
* 字串轉數字 TO_NUMBER select to_number('100') from dual
其它函式
  • 空值處理函式 NVL : … NVL(檢測的值,如果為 null 的值);
  • 空值處理函式 NVL2:…NVL2(檢測的值,如果不為 null 的值,如果為 null 的值);
  • 條件取值 decode: decode(條件,值 1,翻譯值 1,值 2,翻譯值 2,…值 n,翻譯值 n,預設值)【功能】根據條件返回相應值
select name ,(case ownertypeid
when 1 then '居民'
when 2 then '行政事業單位'
when 3 then '商業'
else '其它'
end ) from T_OWNERS
 select name,(case
when ownertypeid= 1 then '居民'
when ownertypeid= 2 then '行政事業'
when ownertypeid= 3 then '商業'
end ) from T_OWNERS

行列轉換

select (select name from T_AREA where id= areaid ) 區域,
sum( case when month='01' then money else 0 end) 一月,
sum( case when month='02' then money else 0 end) 二月,
sum( case when month='03' then money else 0 end) 三月,
sum( case when month='04' then money else 0 end) 四月,
sum( case when month='05' then money else 0 end) 五月,
sum( case when month='06' then money else 0 end) 六月,
sum( case when month='07' then money else 0 end) 七月,
sum( case when month='08' then money else 0 end) 八月,
sum( case when month='09' then money else 0 end) 九月,
sum( case when month='10' then money else 0 end) 十月,
sum( case when month='11' then money else 0 end) 十一月,
sum( case when month='12' then money else 0 end) 十二月
from T_ACCOUNT where year='2012' group by areaid

按季度統計 2012 年各個地區的水費

select (select name from T_AREA where id= areaid ) 區域,
sum( case when month>='01' and month<='03' then money else 0 end) 第一季度,
sum( case when month>='04' and month<='06' then money else 0 end) 第二季度,
sum( case when month>='07' and month<='09' then money else 0 end) 第三季度,
sum( case when month>='10' and month<='12' then money else 0 end) 第四季度
from T_ACCOUNT where year='2012' group by areaid

分析函式

  • RANK 相同的值排名相同,排名跳躍 select rank() over(order by usenum desc ),usenum from T_ACCOUNT
  • DENSE_RANK 相同的值排名相同,排名連續 select dense_rank() over(order by usenum desc ),usenum from T_ACCOUNT
  • ROW_NUMBER 返回連續的排名,無論值是否相等 select row_number() over(order by usenum desc ),usenum from T_ACCOUNT

集合運算

  • UNION ALL(並集),返回各個查詢的所有記錄,包括重複記錄。
select * from t_owners where id<=7
union all
select * from t_owners where id>=5
  • UNION(並集),返回各個查詢的所有記錄,不包括重複記錄。
select * from t_owners where id<=7
union
select * from t_owners where id>=5
  • INTERSECT(交集),返回兩個查詢共有的記錄。 *
select * from t_owners where id<=7
intersect
select * from t_owners where id>=5
  • MINUS(差集),返回第一個查詢檢索出的記錄減去第二個查詢檢索出的記錄之後剩餘的記錄。在這裡插入圖片描述
select * from t_owners where id<=7
minus
select * from t_owners where id>=5

ORACLE 物件

檢視

定義:

檢視其實是一個虛擬的表,它的資料其實來自於表。如果更改了檢視的資料,表的資料也自然會變化,更改了表的資料,檢視也自然會變化。一個檢視所儲存的並不是資料,而是一條 SQL語句。

優點:
  • 簡化資料操作:檢視可以簡化使用者處理資料的方式。
  • 著重於特定資料:不必要的資料或敏感資料可以不出現在檢視中。
  • 檢視提供了一個簡單而有效的安全機制,可以定製不同使用者對資料的訪問許可權。
  • 提供向後相容性:檢視使使用者能夠在表的架構更改時為表建立向後相容介面。
語法:
  • 建立檢視
CREATE [OR REPLACE] [FORCE] VIEW view_name
AS subquery
[WITH CHECK OPTION ]
[WITH READ ONLY]
   OR REPLACE :若所建立的試圖已經存在,ORACLE 自動重建該檢視;----修改檢視
	FORCE     :不管基表是否存在 ORACLE 都會自動建立該檢視;---- 帶錯誤地試圖
	subquery  :一條完整的 SELECT 語句,可以在該語句中定義別名;
	WITH CHECK OPTION :插入或修改的資料行必須滿足檢視定義的約束;----帶檢查約束
	WITH READ ONLY    :該檢視上不能進行任何 DML 操作。 ---- 只讀檢視
  • 刪除試圖

DROP VIEW view_name

鍵保留表(複雜檢視,即關聯多個表時)

鍵保留表是理解連線檢視修改限制的一個基本概念。該表的主鍵列全部顯示在檢視中,並且它們的值在檢視中都是唯一且非空的。也就是說,表的鍵值在一個連線檢視中也是鍵值,那麼就稱這個表為鍵保留表。

物化檢視

定義:

檢視是一個虛擬表(也可以認為是一條語句),基於它建立時指定的查詢語句返回的結果集。每次訪問它都會導致這個查詢語句被執行一次。為了避免每次訪問都執行這個查詢,可以將這個查詢結果集儲存到一個物化檢視(也叫實體化檢視)。 物化檢視與普通的檢視相比的區別是物化檢視是建立的副本,它類似於一張表,需要佔用儲存空間。而對一個物化檢視查詢的執行效率與查詢一個表是一樣的。

建立物化檢視:
CREATE METERIALIZED VIEW view_name
[BUILD IMMEDIATE | BUILD DEFERRED ]
REFRESH [FAST|COMPLETE|FORCE]
[
ON [COMMIT |DEMAND ] | START WITH (start_time) NEXT
(next_time)
]
AS
subquery

BUILD IMMEDIATE 是在建立物化檢視的時候就生成資料 BUILD DEFERRED 則在建立時不生成資料,以後根據需要再生成資料。 預設為 BUILD IMMEDIATE。

  • 重新整理(REFRESH):指當基表發生了 DML 操作後,物化檢視何時採用哪種方式和基表進行同步。

  • REFRESH 後跟著指定的重新整理方法有三種:FAST、COMPLETE、FORCE。 FAST重新整理採用增量重新整理,只重新整理自上次重新整理以後進行的修改。COMPLETE 重新整理對整個物化檢視進行完全的重新整理。如果選擇 FORCE 方式,則 Oracle 在重新整理時會去判斷是否可以進行快速重新整理,如果可以則採用 FAST 方式,否則採用 COMPLETE的方式。FORCE 是預設的方式。

  • 重新整理的模式有兩種:ON DEMAND 和 ON COMMIT。 ON DEMAND 指需要手動重新整理物化檢視(預設)。ON COMMIT 指在基表發生 COMMIT 操作時自動重新整理。

  • 手動書信物化檢視 begin DBMS_MVIEW.refresh(‘物化檢視名稱’,‘C’); end; 或者命令視窗 輸入 EXEC DBMS_MVIEW.refresh(‘物化檢視名稱’,‘C’);

  • 建立增量重新整理的物化檢視

  1. 建立物化檢視中涉及表的物化檢視日誌
  2. 在查詢語句中,必須包含所有表的 rowid ( 以 rowid 方式建立物化檢視日誌 )

序列

定義:

序列是 ORACLE 提供的用於產生一系列唯一數字的資料庫物件。

語法
CREATE SEQUENCE sequence //建立序列名稱
[INCREMENT BY n] //遞增的序列值是n 如果n是正數就遞增,如果是負數就遞減 默
認是 1
[START WITH n] //開始的值,遞增預設是 minvalue 遞減是 maxvalue
[{MAXVALUE n | NOMAXVALUE}] //最大值
[{MINVALUE n | NOMINVALUE}] //最小值
[{CYCLE | NOCYCLE}] //迴圈/不迴圈
[{CACHE n | NOCACHE}];//分配並存入到記憶體中
* NEXTVAL 返回序列的下一個值
* CURRVAL 返回序列的當前值
修改和刪除序列
  • ALTER SEQUENCE 序列名稱 MAXVALUE 5000 CYCLE;
  • DROP SEQUENCE 序列名稱;

同義詞

定義:

同義詞實質上是指定方案物件的一個別名。通過遮蔽物件的名稱和所有者以及對分散式資料庫的遠端物件提供位置透明性,同義詞可以提供一定程度的安全性。同時,同義詞的易用性較好,降低了資料庫使用者的 SQL 語句複雜度。 同義詞允許基物件重新命名或者移動,這時,只需對同義詞進行重定義,基於同義詞的應用程式可以繼續執行而無需修改。 你可以建立公共同義詞和私有同義詞。其中,公共同義詞屬於 PUBLIC 特殊使用者組,資料庫的所有使用者都能訪問;而私有同義詞包含在特定使用者的方案中,只允許特定使用者或者有基物件訪問許可權的使用者進行訪問。 同義詞本身不涉及安全,當你賦予一個同義詞物件許可權時,你實質上是在給同義詞的基物件賦予許可權,同義詞只是基物件的一個別名。

  • create [public] SYNONYM synooym for object;

索引

定義:

索引是用於加速資料存取的資料物件。合理的使用索引可以大大降低 i/o 次數,從而提高資料訪問效能。 索引是需要佔據儲存空間的,也可以理解為是一種特殊的資料。形式類似於下圖的一棵“樹”,而樹的節點儲存的就是每條記錄的實體地址,也就是我們提到的偽列(ROWID)

  • 普通索引 create index 索引名稱 on 表名(列名);
  • 唯一索引 create unique index 索引名稱 on 表名(列名);
  • 複合索引 create index 索引名稱 on 表名(列名,列名…);
  • 反向鍵索引 create index 索引名稱 on 表名(列名) reverse; 應用場景:當某個欄位的值為連續增長的值,如果構建標準索引,會形成歪脖子樹。這樣會增加查詢的層數,效能會下降。建立反向鍵索引,可以使索引的值變得不規則,從而使索引樹能夠均勻分佈。
  • 點陣圖索引 create bitmap index 索引名稱 on 表名(列名); 使用場景:點陣圖索引適合建立在低基數列上點陣圖索引不直接儲存 ROWID,而是儲存位元組位到 ROWID 的對映 優點:減少響應時間,節省空間佔用

ORACLE 程式設計

PL/SQL

定義:

PL/SQL(Procedure Language/SQL)是 Oracle 對 sql 語言的過程化擴充套件,指在 SQL 命令語言中增加了過程處理語句(如分支、迴圈等),使 SQL 語言具有過程處理能力。把 SQL 語言的資料操縱能力與過程語言的資料處理能力結合起來,使得 PLSQL 面向過程但比過程語言簡單、高效、靈活和實用。

  • 基本語法

[declare – 宣告變數 ] begin – 程式碼邏輯 [exception – 異常處理 ] end;

  • 變數:

宣告變數:變數名 型別(長度) 變數賦值:變數名:=變數值

  • 屬性型別

%TYPE 引用型: 引用某表某列的欄位型別 %ROWTYPE 記錄型: 標識某個表的行記錄型別

  • 異常

    exception
      when 異常型別 then
      異常處理邏輯
    
  1. 預定義異常 - 當 PL/SQL 程式違反 Oracle 規則或超越系統限制時隱式引發

NO_DATA_FOUND - 使用 select into 未返回行 TOO_MANY_ROWS - 執行 select into 時,結果集超過一行

  1. 使用者定義異常 - 使用者可以在 PL/SQL 塊的宣告部分定義異常,自定義的異常通過 RAISE 語句顯式引發
  • 條件判斷

    if 條件 then 業務邏輯 elsif 條件 then 業務邏輯 else 業務邏輯 end if;

  • 迴圈

  1. 無條件迴圈

loop – 迴圈語句 end loop;

  1. 條件迴圈

while 條件 loop end loop;

  1. for迴圈

for 變數 in 起始值…終止值 loop end loop;

  • 遊標
  1. .什麼是遊標

遊標是系統為使用者開設的一個數據緩衝區,存放 SQL 語句的執行結果。我們可以把遊標理解為 PL/SQL 中的結果集。

  1. 語法結構及示例

cursor 遊標名稱 is SQL 語句;

open 遊標名稱
loop
fetch 遊標名稱 into 變數
exit when 遊標名稱%notfound
end loop;
close 遊標名稱
  1. 帶引數的遊標 declare
v_pricetable T_PRICETABLE%rowtype;-- 價格行物件
cursor cur_pricetable(v_ownertypeid number) is select *
from T_PRICETABLE where ownertypeid=v_ownertypeid;-- 定義遊
標
begin
open cur_pricetable(2);-- 開啟遊標
loop
fetch cur_pricetable into v_pricetable;-- 提取遊標到變數
exit when cur_pricetable%notfound;-- 當遊標到最後一行下面退
出迴圈
dbms_output.put_line('價格:'||v_pricetable.price ||'噸
位:'||v_pricetable.minnum||'-'||v_pricetable.maxnum );
end loop;
close cur_pricetable;-- 關閉遊標
end ;
  1. for 迴圈提取遊標值
  declare
    cursor cur_pricetable(v_ownertypeid number) is select *
    from T_PRICETABLE where ownertypeid=v_ownertypeid;-- 定義遊
    標
    begin
    for v_pricetable in cur_pricetable(3)
    loop
    dbms_output.put_line('價格:'||v_pricetable.price ||'噸
    位:'||v_pricetable.minnum||'-'||v_pricetable.maxnum );
    end loop;
    end ;

儲存函式

定義:

儲存函式又稱為自定義函式。可以接收一個或多個引數,返回一個結果。在函式中我們可以使用 P/SQL 進行邏輯的處理。

儲存函式語法結構
CREATE [ OR REPLACE ] FUNCTION 函式名稱
(引數名稱 引數型別, 引數名稱 引數型別, ...)
RETURN 結果變數資料型別
IS
變數宣告部分;
BEGIN
邏輯部分;
RETURN 結果變數;
[EXCEPTION
異常處理部分]
END;

儲存過程

什麼是儲存過程

儲存過程是被命名的 PL/SQL 塊,儲存於資料庫中,是資料庫物件的一種。應用程式可以呼叫儲存過程,執行相應的邏輯。 儲存過程與儲存函式都可以封裝一定的業務邏輯並返回結果,存在區別如下:

  • 儲存函式中有返回值,且必須返回;而儲存過程沒有返回值,可以通過傳出引數返回多個值。
  • 儲存函式可以在 select 語句中直接使用,而儲存過程不能。過程多數是被應用程式所呼叫。
  • 儲存函式一般都是封裝一個查詢結果,而儲存過程一般都封裝一段事務程式碼。
儲存過程語法結構
  CREATE [ OR REPLACE ] PROCEDURE 儲存過程名稱
    (引數名 型別, 引數名 型別, 引數名 型別)
    IS|AS
    變數宣告部分;
    BEGIN
    邏輯部分
    [EXCEPTION
    異常處理部分]
    END;

引數只指定型別,不指定長度 過程引數的三種模式:

  • IN 傳入引數(預設)
  • OUT 傳出引數 ,主要用於返回程式執行結果
  • IN OUT 傳入傳出引數

觸發器

定義

資料庫觸發器是一個與表相關聯的、儲存的 PL/SQL 程式。每當一個特定的資料操作語句(Insert,update,delete)在指定的表上發出時,Oracle 自動地執行觸發器中定義的語句序列。

觸發器可用於

 資料確認  實施複雜的安全性檢查  做審計,跟蹤表上所做的資料操作等  資料的備份和同步

觸發器分類

 前置觸發器(BEFORE)  後置觸發器(AFTER)

建立觸發器的語法
CREATE [or REPLACE] TRIGGER 觸發器名
BEFORE | AFTER
[DELETE ][[or] INSERT] [[or]UPDATE [OF 列名]]
ON 表名
[FOR EACH ROW ][WHEN(條件) ]
declare
……
begin
PLSQL 塊
End ;
  • FOR EACH ROW 作用是標註此觸發器是行級觸發器 語句級觸發器