Oracle開發(fā)基礎(chǔ)重點(diǎn)
Oracle一般操作
表空間
--創(chuàng)建表空間
create tablespace 表空間名
datafile 表空間存放路徑
size 表空間默認(rèn)大小
autoextend on 設(shè)置自動(dòng)增長(zhǎng),超量自動(dòng)擴(kuò)容
next 10m 每次擴(kuò)容大小
用戶
--創(chuàng)建用戶
create user 用戶名
identified by 密碼
default tablespace 從屬于表空間名;
--用戶賦權(quán)(dba、等等)
grant 權(quán)限 tp 用戶名;
表
--創(chuàng)建表
create table 表名稱(
字段名 類型(長(zhǎng)度) primary key,--主鍵約束
字段名 類型(長(zhǎng)度),
...
)
--增加字段語法
alter table 表名稱 add(
列名 類型 [可以在此指定默認(rèn)值],
列名 類型
--eg:new varchar2(200)
)
--修改字段語法
alter table 表名稱 modify(
列名 類型 [可以在此指定默認(rèn)值],
列名 類型
)
--修改字段名
alter table 表名稱 rename column 原列名 to 新列名
--eg:alter table t_test rename column old to new
--刪除字段
--刪除一個(gè)字段
alter table 表名稱 drop column 列名
--刪除多個(gè)字段
alter tablr 表名稱 drop(列名1,列名2,...)
--刪除表
drop table 表名稱
表數(shù)據(jù)
--插入數(shù)據(jù)
insert into 表名(列名1,列名2,...)values(值1,值2,...);
commit;
--修改數(shù)據(jù)
update 表名 set 列名1=值1,列名2=值2,...where 條件;
commit;
--刪除數(shù)據(jù)
--刪除方式一
delete from 表名 where 刪除條件;
commit;
--刪除方式二
truncate table 表名稱
Oracle 查詢操作
單表查詢
select
distinct/*去重關(guān)鍵字*/(列名1,列名2,...或者 *)
from
表名,表別名,視圖名,...
where
條件:like,and,or,范圍,>=,<=,between小and大,...
group by
分組條件列
having
過濾條件
--聚合關(guān)鍵字
count sum max min avg
--偽列
rowid/*一行數(shù)據(jù)對(duì)應(yīng)的物理地址*/
rownum/*標(biāo)識(shí)結(jié)果集的序號(hào)*/
多表查詢
--消笛卡爾積 主鍵關(guān)聯(lián)外鍵
select
表1.列名1, 表2.列名2, ...
from
表1, 表2, ...
where
條件語句
左右外連接關(guān)鍵字
left(right) join --SQL語句
+ --Oracle語句
子查詢
select * from 表名 where **>(select * from 表名)
--子查詢語句的結(jié)果只能是一條記錄
幾條關(guān)鍵語句
-- 分頁(yè)查詢
select from (select rownum r,t.* from t where rownum <=20 order by **) where r>10
--select子查詢
select id,name,
(select name from t_address where id=addressid) addressname
from t_owners
--from后的子查詢
(select o.id 業(yè)主編號(hào),o.name 業(yè)主名稱,ot.name 業(yè)主類型
from T_OWNERS o,T_OWNERTYPE ot
where o.ownertypeid=ot.id)
where 業(yè)主類型='居民'
Oracle對(duì)象
視圖
--創(chuàng)建視圖
create or replace force view v_test
as subquery(一條完整的sql語句)
--只讀 read only
--刪除視圖
drop view v_test
--查詢視圖
select * from v_test
? 視圖其實(shí)是一個(gè)虛擬的表,它的數(shù)據(jù)其實(shí)來自于表。如果更改了視圖的數(shù)據(jù),表的數(shù)據(jù)也自然會(huì)變化,更改了表的數(shù)據(jù),視圖也自然會(huì)變化。一個(gè)視圖所存儲(chǔ)的并不是數(shù)據(jù),而是一條 SQL語句。
物化視圖
--創(chuàng)建物化視圖
create meterialized view v_test as subquery
--創(chuàng)建增量物化視圖
--先創(chuàng)建物化視圖日志,涉及幾個(gè)表就創(chuàng)幾個(gè)
create meterialized view log on 表名 with rowid;
--創(chuàng)建增量物化視圖
create meterialized view 視圖名
refresh fast
as
subquery
序列
--創(chuàng)建序列
create sequence 序列名
--提取下個(gè)值
select 序列名.nextval from dual
--提取當(dāng)前值
select 序列名.currval from dual
同義詞
--創(chuàng)建同義詞
create [是否共有加public] synonym 同義詞名稱 for 表名,視圖名,...
索引
--創(chuàng)建索引
create [唯一索引 unique] index 索引名 on 表名(列名,列名.列名,.../*復(fù)合索引*/) [反向索引加reverse]
Oracle編程
PL/SQL
--plsql基本語法結(jié)構(gòu)
declare
--聲明變量
變量名 類型(長(zhǎng)度)
begin
--變量賦值
變量名:= 值
select 列名 into 變量名 from 表名 where 條件/*從表中數(shù)據(jù)直接賦值*/
代碼邏輯
exception
end
聲明變量屬性類型
--引用型:引用某表某列的字段類型
表名.列名%type引用型
--記錄型:標(biāo)識(shí)某個(gè)表的行記錄類型
表名%rowtype記錄型
異常
--記住兩個(gè)異常
NO_DATA_FOUND:沒有查到數(shù)據(jù)
TOO_MANY_ROWS:查到多行數(shù)據(jù)
--使用異常
exception
when 異常名 then
業(yè)務(wù)邏輯
條件判斷
--基本語法
if 條件 then
業(yè)務(wù)邏輯
end if;
--基本語法2
if 條件 then
業(yè)務(wù)邏輯
else
業(yè)務(wù)邏輯
end if;
--基本語法
if 語法 then
業(yè)務(wù)邏輯
elsif 條件 then
業(yè)務(wù)邏輯
else
業(yè)務(wù)邏輯
end if;
輸出語句
DBMS_OUTPUT.PUT_LINE()
循環(huán)
--無條件循環(huán)
loop
--循環(huán)體
end loop;
--條件循環(huán)
while 條件
loop
--循環(huán)體
end loop;
--for循環(huán)
for 變量 in 起始值..終止值
loop
--循環(huán)體
end loop;
游標(biāo)
--聲明游標(biāo)(無參)
cursor 游標(biāo)名稱 is subquery
--聲明游標(biāo)(有參)
cursor 游標(biāo)名稱(聲明變量) is subquery(條件中有控制變量)
--使用游標(biāo)語法
open 游標(biāo)名稱(有參無參)
loop
fetch 游標(biāo)名稱 into 變量
exit when 游標(biāo)名稱%notfound
end loop;
close 游標(biāo)名稱;
--用for循環(huán)使用游標(biāo)
open 游標(biāo)名稱(有無參)
for 要取變量 in 游標(biāo)名稱(有無參)
loop
end loop;
end;
存儲(chǔ)函數(shù)
--存儲(chǔ)函數(shù)可以接收多個(gè)參數(shù),返回一個(gè)結(jié)果
--創(chuàng)建存儲(chǔ)函數(shù)
create or replace function 函數(shù)名
(參數(shù)名 類型 , 參數(shù)名 類型 , ...)
return 結(jié)果變量的數(shù)據(jù)類型
is
變量聲明
begin
邏輯業(yè)務(wù)
return 結(jié)果變量;
異常處理
end;
存儲(chǔ)過程
--存儲(chǔ)過程可以通過傳出參數(shù)返回多個(gè)值
--存儲(chǔ)過程不可以在select語句中使用
--存儲(chǔ)過程一般封裝一段事務(wù)
--創(chuàng)建不帶返回參數(shù)的存儲(chǔ)過程
create or replace procedure 過程名
(參數(shù)名 類型 , 參數(shù)名 類型 , ...)
is\as --都可以使用
變量聲明
begin
邏輯業(yè)務(wù)
異常處理
end;
存儲(chǔ)過程使用
call 過程名(符合定義類型的參數(shù));
JDBC調(diào)用不帶參數(shù)返回的存儲(chǔ)過程
java.sql.CallableStatement = java.sql.connection.prepareCall("{call 過程名(?,?,?,?,...);}")
--創(chuàng)建帶返回參數(shù)的存儲(chǔ)過程
--過程參數(shù)有:IN 傳入?yún)?shù)|OUT 傳出參數(shù),主要用于返回程序運(yùn)行結(jié)果|IN OUT 傳入傳出參數(shù)
create or replace procedure
(參數(shù)名 類型, 參數(shù)名 過程參數(shù) 類型,...)
is
begin
業(yè)務(wù)邏輯
end;
--使用
declare
定義傳出參數(shù)的變量
begin
過程名(符合定義的參數(shù))
同時(shí)可以輸出傳出參數(shù)
end;
JDBC調(diào)用帶參數(shù)返回的存儲(chǔ)過程
--要定義傳出數(shù)據(jù)類型
//提取傳出參數(shù)
數(shù)據(jù)類型 變量名 = stmt.get(index)
return
觸發(fā)器
create or replace trigger 觸發(fā)器名
before | after
[delete]|[insert]|[update] of 列名
on 表名
[for each row] [when(條件)]
declare
begin
plsql語法塊
end;
--for each row的作用是標(biāo)準(zhǔn)此觸發(fā)器是行級(jí)觸發(fā)器,不寫的話是語句級(jí)觸發(fā)器
使用前置觸發(fā)器
create or replace trigger tri_account_updatenum1
before
update of num1
on t_account
for each row
declare
begin
:new.usenum:=:new.num1-:new.num0;
end
使用后置觸發(fā)器
create trigger tri_owners_log
after
update of name
on t_owners
for each row
declare
begin
insert into t_owners_log values(sysdate,:old.id,:old.name,:new.name);
end;