1. 程式人生 > >數據庫之Oracle(二)

數據庫之Oracle(二)

to_char jpg nbsp 數字 立即執行 style begin 高級 會有

上文中對於oracle數據庫做了一些介紹,本文中將主要著重介紹在數據庫開發中運用到的知識,比如字符串的格式轉換,還有存儲過程的書寫,高級連接等

一:存儲過程

    存儲過程是為了更加方便,有效的去執行復雜的sql語句。

    存儲過程的格式:

    示例:輸出hello world

    Create or replace procedure name Is       --->創建存儲過程,存在就替換

    begin --->開始執行

    Execute immediate              --->立即執行(對表做操作時必須要有這條語句)

    DBMS_output.put_line(‘Hello World’);   --->輸出‘hello world’

    End; --->結尾

    目前我在工作中用存儲過程的主要作用是為了存放 創表還有查詢,添加數據語句

    存在存儲過程和java 代碼一樣,我們習慣於去創建一個package包保存,創建包

    示例:

    Create or replace package Packagename As

    Begin

     Class :=’二年級’; --->公共變量(可以在下面的存儲過程中使用)

    School:=’中南小學’; --->公共變量

     Procedure name1; --->Package Body中的存儲過程 name1

     Procedure name2; --->Package Body中的存儲過程 name2

    End Packagename ;

    上問中的包內有兩個存儲過程,這兩個存儲過程實際是存放在包底下的body裏面,創建好包以後,需要創建它的Body

    示例:

    Create or replace Package Body bodyname AS --->創建body

    Begin --->開始

    Create or replace Procedure name1 as --->存放存儲過程

    Begin

    Create table table1 (name varchar2(20),age number);

    End name1 ;

    Procedure name2 ..........

    End bodyname; ---->body 結束

二:在上篇中介紹了函數,那麽實際開發中對於數據的處理,往往需要多個函數一起使用

示例:

Sql語句

顯示+10000/-10000

To_char(nvl(num,0),’$09999’)

需要將數字輸出

lpad(nvl(user_id,0),12,0) 這裏需要使用從左補充0,否則取值會有問題

對於日期格式的取值

Nvl2(date,To_char(date,’yyyymmdd’),’19931111’) 利用nvl2函數去判斷非空

未完待續......

    當我們在對數據做處理的時候,需要從各個不同的表中取到相應的數據,這時候就有了高級連接。

三:高級連接

    開發中往往需要從不止一張表中獲取數據,那麽都有哪些方法可以獲取到這些數據呢?

    下面讓我來一一為大家介紹,數據庫中各種表之間的聯系。

    表與表之間的連接通常分為內聯和外聯還有全聯。

技術分享

  內聯:inner join on

示例:

會顯示bugrecord和bug表中bug_name相等的數據所有信息

Sql語句

select * from bugrecord inner join bug onbug.BUG_NAME=bugrecord.bug_name

  外聯(左聯和右聯)

    在多表進行連接時,我們會有主表和從表的區別。

      左連接 Left join on

示例:

會將左邊主表(bugrecord)中的數據全部顯示,右邊從表(bug)的數據只有和主表bug_name匹配的才會顯示

Sql語句

select * from bugrecord left join bug on bug.BUG_NAME=bugrecord.bug_name

      右連接 Right join on

示例:

會將右邊主表(bug)中的數據全部顯示,左邊從表(bugrecord)的數據只有和主表bug_name匹配的才會顯示

Sql語句

select * from bugrecord right join bug on bug.BUG_NAME=bugrecord.bug_name

  Union 與Union ALL的區別

    Union ALL

示例:

Union ALL 使用時,表中的數據結構必須相同,會將關聯表中所有的信息都顯示出來

Sql語句

select * from bugrecord union all select * from project

    Union

示例:

Union 使用時,表中的數據結構必須相同,會將關聯表中所有的信息都顯示出來,會自動去掉重復的信息

Sql語句

select * from bugrecord union select * from project

    在開發中如果遇到A表中的一個字段需要在B表中去對照獲取最終值,這種情況推薦使用臨時表來處理,使用臨時表的效率更加高效,在數據量大的情況下效率很重要。

    With t_lise as lise

    (select a.bugId as t_id,

     B.tranformvalue as t_value

     From (select bugId from A) a left join B b on a.bugid=b.codevalue

    )

     Select p.describe ||list.t_value from project p Left join lise on lise.t_id=p.bugId

  這種寫法很很大程度上會優化sql的效率,使用起來十分的便利。今後將會有一段時間從事oracle數據庫的開發工作,後續會補充在工作中遇到的難點,以及各種優化的語句,也期望大家可以在下面留言,有更好的優化或者本文提到的不對的地方一一指出。

    始終堅信------但行好事,莫問前程!

數據庫之Oracle(二)