5四、Oracle

Oracle以數據存儲量大,處理速度快,安全性高,容錯性強等出色的特徵,長期以來佔據着全球數據庫市場的主導地位。java

 

安裝:百度搜索安裝教程sql

 

鏈接:使用PLSQL Developer對Oracle進行鏈接數據庫

 

體系結構:編程

數據庫:Oracle數據庫是數據的物理存儲。這就包括數據文件ORA或者DBF,控制文件,聯機日誌,參數文件。其實Oracle數據庫的概念和其餘數據庫不同,這裏的數據庫是一個操做系統只有一個庫,能夠看做是Oracle就只有一個大數據庫安全

實例:一個Oracle實例有一個系列的後臺進程和內存結構組成,一個數據庫能夠有N個實例oracle

用戶:用戶是在實例下創建的,不一樣的實例能夠建相同名字的用戶。app

表空間:表空間是Oracle對物理數據庫上相關數據文件的邏輯映射,一個數據庫在邏輯上被劃分到一個到若干個表空間,每一個表空間包含了在邏輯上相關聯的一組結構,每一個數據庫至少有一個表空間編程語言

數據文件:數據文件是數據庫的物理存儲單位。數據庫的數據是存儲在表空間中的。真正是在某一個或多個數據文件中。而一個表空間能夠由一個或多個數據文件組成,一個數據文件只能屬於一個表空間,一旦數據文件被加入到某個表空間後,就不能刪除這個文件,若是要刪除某個數據文件,只能刪除其所屬於的表空間才行。ide

 

建立表空間:函數

create tablespace demo

datafile'c:\demo.dbf'

size 100m

autoextend on

next 10m;

 

刪除表空間

drop tablespace demo;

 

建立用戶

create user demoUser

identified by 123456

default tablespace demo;

 

給用戶受權

grant dba to demo;

補充:oracle數據庫中的經常使用角色:一、connect,鏈接角色,基本角色;二、resource,開發者角色;三、dba,超級管理員角色

 

Oracle數據類型

一、Varchar,varchar2,表示一個字符串

二、number,number(n)表示一個整數,長度爲n;number(m,n),總長度m,小數n,整數是m-n

三、data,表示日期類型

四、clob,大對象,表示大文本數據類型

五、blob,大對象,表示二進制數據

 

表的管理

一、創建表

create table person(

    id number(20),

    name varchar(10)

);

 

二、修改表的結構

2.一、添加一列

alter table person add gender number(1);

2.二、修改列類型

alter table person modify gender char(1);

2.三、修改列名稱

alter table person rename column gender to sex;

2.四、刪除列

alter table person drop column sex;

 

三、數據增刪改:

3.一、添加一條記錄

insert into person (id,name)value (1,‘讀者’);

commit;

3.二、修改一條記錄

update person set name=‘新讀者’ where id =1 ;

commit;

3.三、刪除

delete from person;--刪除表中全部記錄

drop table person;--刪除表結構

truncate table person;--相似deldte,可是效率更高

 

注意:id(主鍵的值)通常使用序列,默認從1開始,依次遞增,主要用來給主鍵賦值使用

建立一個序列:create sequence s_person;

使用序列:insert into person (id,name)vlaue (s_person.nextval,'讀者');

 

scott用戶,密碼tiger

解鎖scott用戶:alter user scott account unlock;

解鎖scott用戶密碼:alter user scott identified by tiger;

 

函數:

單行函數:做用於一行,返回一個值

多行函數:做用於多行,返回一個值

 

字符函數:

select upper(‘yes’) from dual:--YES

select lower(‘YES’) from dual;--yes

注意:dual表示虛表,僅用於補全語句

 

數值函數:

select round(12.22,1)from dual;--四捨五入,後面的參數表示保留的小數位數

select trunc(12.22,1)from dual;--直接截取

select mod(10,3) from dual;--求餘數

 

日期函數:

select sysdate from dual;--查詢如今的時間

select sysdate-e.hiredate from emp e;--相差的天數

select months_between(sysdate,e.hiredate)from emp e;--相差的月數

 

轉換函數:

select to_char(sysdate,'fm yyyy-mm-dd hh24:mi:ss') from dual;--日期轉字符串

select to_date('2018-6-7 16:39:50','fm yyyy-mm-dd hh24:mi:ss') from dual;--字符串轉日期

 

通用函數:

select e.sal+nvl(e.comm,0) from emp e;-- 若是e.comm的值爲null,則用默認值0

 

條件表達式:

第一種用法:

select e.name

    case e.name

        when‘SMITH’ then ‘史密斯’

            when'ALLEN' then'阿倫'

                else ‘無’ --可省略

                    end

from emp e;

第二種用法:

select e.sal

    case e.sal

        when e.sal>3000 then ‘高收入’

            when e.sal>1500 then ‘中等收入’

                else ‘低收入’

                    end

from emp e;

補充:oracle專用寫法

select e.name

    decode(e.name

        'SMITH' , '史密斯',

            'ALLEN','阿倫')中文名

from emp e;

 

多行函數:

select count(1)from emp;--查詢總數量

select sum(sal) from emp;--查詢總和

select max(sal) from emp; --查詢最大

select min(sal) from emp;--查詢最小

select avg(sal) from emp;--查詢平均值

 

分組查詢:

select e.deptno,avg(e.sal) 

from emp e

where e.sal >800

group by e.deptno

having avg(e.sal) >2000

 

多表查詢的概念

笛卡爾積:表1,n條記錄,表2,m條記錄,結果n*m

等值鏈接:

select * from emp e , dept d

where  e.deptno=d.deptno

內鏈接:

select * from emp e inner join dept d

on e.deptno = d.deptno

外鏈接:

select * from emp e right join dept d 

on e.deptno = d.deptno;--右外鏈接,右表全部內容和左表交集內容

select *from emp e left join dept d

on e.deptno = d.deptno;--左外鏈接,左表全部內容和右邊交集內容

 

 補充:oracle中專用外鏈接

select * from emp e ,dept d

where e.deptno(+) = d.deptno;-- 等同於外鏈接的第一條語句

 

自鏈接:就是站在不一樣的角度把一張表當作多張表

select e1.name ,e2.name

from emp e1, emp e2

where e1.mgr=e2.empno;

 

子查詢

子查詢返回一個值:

select * from emp where sal =(select sal from emp where id = 1);

子查詢返回一個集合:

select * from emp where sal in(select sal from emp where deptno = 10);

子查詢返回一個表:

select t.deptno,t.msal,e.ename,d.dname

from(select deptno,min(sal) msal from emp group by deptno) t,emp e,dept d where t.deptno = e.deptno and t.msal = r.sal and e.deptno=d.deptno;

 

分頁查詢:

select * from (

        select rownum rn, e.* from(

                select * from emp order by sal desc

) e where rownum<11

)where rn > 5;

 

視圖:就是提供一個查詢的窗口,全部的數據來自於原表

補充:經過查詢語句建立表;create table emp as select * from scott.emp;--能夠跨用戶查詢

建立視圖:create view v_emp as select name,job from emp;

查詢視圖:select * from v_emp

修改視圖:update v_emp set job= ‘CLERK’ where name = ‘ALLEN’ ;commit;

建立只讀視圖:create view v_emp as select name ,job from emp with read only;

視圖的做用:

一、視圖能夠屏蔽掉一些敏感字段

二、保證總部和分部數據及時統一

 

索引:就是在表的列上構建一個二叉樹,達到大幅度提升查詢效率的目的,可是索引會影響增刪改的效率

單列索引:

建立單列索引:create index idx_name on emp(name);

單列索引觸發規則,條件必須索引中的原始值,單行函數和模糊查詢不會觸發

複合索引:

建立複合索引:create index idx_namejob on emp(name,job);

複合索引中的第一列爲優先檢索列,若是要觸發複合索引,必須包含有優先檢索列中的原始值。

 

pl/sql編程語言

pl/sql編程語言是對sql語言的擴展,使得sql語言具備過程化編程語言的特性;比通常的過程化編程語言更加靈活,主要用來編寫存儲過程和存儲函數。

 

聲明方法:

declare 

    i number(2):=10;

    s varchar(10):=‘小明’;

    ena emp.name%type;

    emprow emp%rowtype;

begin

    dbms_output.put_line(i);

    dbms_output.put_line(s);

    select ename into ena from emp where empno = 7788;

    dbms_output.put_line(ena);

    select * into emprow from emp where empno = 7788;

    dbms_output.put_line(emprow.name || emprow.job);

end;

 

if語句:

declare 

    i number(3):=&age;

begin

    if i<18 then

        dbms_output.put_line(' 未成年');

    if i<50 then

        dbms_output.put_line('中年人');

    else

         dbms_output.put_line('老年人');

    end if;

end;

 

loop語句

 

whlie循環:

declare 

    i number(2) :=1;

begin

    while i<11 loop

        dbms_output.put_line(i);

        i:=i+1;

    end loop;

end;

 

exit語句:

declare 

    i number(2):= 1;

begin

    loop

        exit when i>10;

        dbms_output.put_line(i);

        i:=i+1;

     end loop;

end;

 

for語句

declare 

begin   

    for i in 1.. 10 loop

        dbms_output.put_line(i);

    end loop;

end;

 

遊標:相似與Java中的集合,能夠存放多個對象,多行記錄

declare 

    cursor c2 (eno emp.deptno%type)

    is select empno from emp where deptno =eno;

    en emp.empno&type;

begin 

    open c2(10);

    loop

        fetch c2 into en;

        exit when c2%notfound;

        update emp set sal = sal+100 where empno = en;

        commit;

    end loop;

    close c2;

end;

 

存儲過程:就是提早編譯好的一段pl/sql語言,放置在數據庫,能夠直接被調用。這段pl/sql通常都是固定步驟的業務。

create or replace procedure p1(eno emp.empno%type)

is

begin

    update emp set sal = sal+100 where empno = eno;

    commit;

end;

 

調用存儲過程

declare

begin

    p1(7788);

end;

 

存儲函數:

create or replace function f_yearsal (eno emp.empno%type)return number

is

    s number(10);

begin

    select sal*12+nvl(comm,0) into s from emp where empno   = eno;

    return s;

end;

 

調用存儲函數

declare 

    s number(10);

begin

    s:=f_yearsal(7788);

    dbms_output.put_line(s);

end;

 

out類型

create or replace procedure p_yearsal (eno emp.empno%type,yearsal out number)

is

    s number(10);

    c emp.comm%type;

begin

    select sal*12,nvl(comm,0) into s,c from emp where empno = eno;

    yearsal:=s+c;

end;

 

調用:

declare

    yearsal number(10);

begin

    p_yearsal(7788,yearsal);

end;

 

觸發器:就是制定一個規則,在咱們作增刪改操做的時候,只要知足改規則,自動觸發,無需調用。

語句級觸發器:不包含for each row的觸發器

行級觸發器:包含for each row的觸發器

加入for each row 是爲了使用:old 和:new

語句級觸發器代碼:

create or replace trigger t1 

after 

insert 

on person

declare

begin

    dbms_output.put_line('一個新員工入職');

end;

行級觸發器代碼:

create or replace trigger t2

before

update

on emp

for each row

declare

begin

    if :old.sal>:new.sal then

        reise_application_error(-20001,'不能下降工資');

    end if;

end;

 

java調用:

導入jar包,oracle10g對應jar包ojdba14.jar,oracle11g對應jar包ojdbc6.jar

@Test
public class testOracle()throws Exception(){
Class.forName("oracle.jdbc.driver.OraceDriver");
Connection    connection=DriverManager.getConnection("jdbc:oracle:localhost:1521:orcl","user","123456");
PreparedStatement pstm = connection.preparedStatement("select * from emp where = ?");
pstm = setObject(1,7788);
ResultSet rs = pstm.executeQuery();
while(rs.next()){
System.out.println("rs.getString(name)");
}

rs.close();
pst.close();
connection.close();

}

java調用存儲過程和存儲函數:

使用CallableStatement,進行調用。

@Test
public class testOracle()throws Exception(){
Class.forName("oracle.jdbc.driver.OraceDriver");
Connection    connection=DriverManager.getConnection("jdbc:oracle:localhost:1521:orcl","user","123456");
CallableStatement pstm = connection.prepareCall("{call p_yearsal(?,?)}");
pstm.setObject(1,7788);
pstm.registerOutParameter(2,OracleTypes.NUMBER);
pstm.execute();

System.out.println(pstm.getObject(2));


pst.close();
connection.close();

}
相關文章
相關標籤/搜索