Oracle編程

Oracle編程

? 任意語言的三個基本結構:順序結構、分支結構、循環結構。任意語言都擁有變量和常量。

PL/SQL

PL/SQL的基本概念

? PL/SQL(Procedure Language/SQL),是Oracle對Sql語言的過程化拓展,是一門語言,可以讓SQL具備邏輯,具有過程處理能力。

基本語法結構
[declare --聲明變量]
begin
[plsql代碼]
[exception --異常處理]
end;
--常見的簡單模式
begin
    plsql
end
基本元素

變量

注意事項:

  • 變量名 變量類型
  • 賦值符號 :=
  • declare后邊聲明變量,而變量的賦值在begin和end之間
  • 內置存儲函數(過程):DBMS_OUTPUT.PUTLINE()

案例

--變量聲明與賦值
declare --聲明
    v_price number(10,2);
    v_usenum number;
    v_usenum2 number(10,2);
    v_money(10,2);
begin
    v_price:=2.45;
    v_usenum:=9213;
    v_usenum2:=round(v_usenum/1000,2);
    v_money:=v_price*v_usenum2;
    
    DBMS_OUTPUT.put_line('金額:'||v_money);--內置存儲函數,可以輸出
end;
--第二種賦值方法

declare --聲明
    v_price number(10,2);
    v_usenum number;
    v_usenum2 number(10,2);
    v_money(10,2);
    v_num0 number;
    v_num1 number;
begin
    v_price:=2.45;
    --語句:select 【數據庫中的列名】 into 變量名稱 
    select usenum into v_usenum from t_account where year='2012' and monyh='01' and owneruuid=1;
    v_usenum:=9213;
    v_usenum2:=round(v_usenum/1000,2);
    v_money:=v_price*v_usenum2;
end
    

引用類型

語法格式:表名.列名%type

declare --聲明
    v_price number(10,2);
    --可以直接查找到表中的值的類型
    v_usenum t_account.usenum%type;
    v_usenum2 number(10,2);
    v_money(10,2);
    v_num0 number;
    v_num1 number;
begin
    v_price:=2.45;
    select usenum into v_usenum from t_account where year='2012' and monyh='01' and owneruuid=1;
    v_usenum:=9213;
    v_usenum2:=round(v_usenum/1000,2);
    v_money:=v_price*v_usenum2;
end

記錄類型

語法格式:變量名稱 表名%rowtype

使用時語句:變量名稱 . 列名

declare --聲明
    v_price number(10,2);
    --可以直接查找到表中的值的類型
    v_usenum t_account.usenum%type;
    v_usenum2 number(10,2);
    v_money(10,2);
    v_num0 number;
    v_num1 number;
begin
    v_price:=2.45;
    select usenum into v_usenum from t_account where year='2012' and monyh='01' and owneruuid=1;
    v_usenum:=9213;
    v_usenum2:=round(v_usenum/1000,2);
    v_money:=v_price*v_usenum2;
end

異常

在運行程序時出現的錯誤叫做異常(也叫例外)

  • 預定義異常
  • 自定義異常

預定義異常共有21個

--語法格式
exception
    when 異常類型 then
    異常處理邏輯

案例

declare
    v_price number(10,2);-- 水費單價
    v_usenum T_ACCOUNT.USENUM%type; -- 水費字數
    v_usenum2 number(10,3);-- 噸數
    v_money number(10,2);-- 金額
begin
    v_price:=2.45;-- 水費單價
    select usenum into v_usenum from T_ACCOUNT where
    owneruuid=1 and year='2012' and month='01';
    -- 字數換算為噸數
    v_usenum2:= round( v_usenum/1000,3);
    -- 計算金額
    v_money:=round(v_price*v_usenum2,2);
    dbms_output.put_line('單價:'||v_price||'噸
    數:'||v_usenum2||'金額:'||v_money);
exception
    --只要查到這個異常就會處理
    when NO_DATA_FOUND then
    dbms_output.put_line('未找到數據,請核實');
    when TOO_MANY_ROWS then
    dbms_output.put_line('查詢條件有誤,返回多條信息,請核實');
end;

記憶兩個

NO_DATA_FOUND:沒有找到數據

TOO_MANY_ROWS:結果集超過一行

分支結構

條件判斷

--sql中的條件判斷語句
if 條件 then
end if;

if 條件 then
else
end if;

if 條件 then
elsif 條件 then
。。。
else
end if;

案例:

declare
    v_price1 number();
    v_price2 number();
    v_price3 number();
    v_usenum2 number();
    v_money number();
    v_account t_account%rowtype;
--階梯水費計算
begin
    if v_usenum2<=5 then
        v_money:=v_price1*v_usenum2;
    elsif v_usenum2>5 and v_usenum2<=10 then
        v_money:=v_price1*5+ v_price2*(v_usenum2-5)
    else
        v_money:=v_price1*5+ v_price2*(v_usenum2-5)+v_price3*(v_usenum2-10)

循環

循環關鍵字:loop 循環語句 end loop;

--loop無條件循環
loop
    循環語句
end loop;

--案例
declare
    v_num number;
begin
    v_num:=1;
    loop
        dbms_output.put_line(v_num);
        v_num:=v_num+1;
        --這是一個死循環,加條件推出
        if v_num>100 then
            exit;
        (或者:exit when v_num>100;)
    end loop;
end;
--loop有條件循環
while 滿足循環的條件
loop
    循環語句
end loop;

--案例
declare
    v_num number;
begin
    v_num:=1;
    while v_num<=100
    loop
        dbms_output.put_line(v_num);
        v_num:=v_num+1;
    end loop;
end;
--for循環
for 局部變量 in 條件
loop
    循環語句
end loop;

--案例
declare
    v_num number;
begin
    for v_num in 1..100
    loop
        dbms_output.put_line(v_num);
    end loop;
end;

游標

? 游標是系統為用戶開設的一個數據緩沖區,存放SQL語句的執行結果。

游標的作用

? 速度快!2017年開發人員基本不用游標了,但是在今后的學習中還要涉及到。

申明游標語法

cursor 游標名稱 is SQL語句

使用游標語法

open 游標名稱
loop
    fetch 游標名稱 into 變量
    --返回一個布爾值
    exit when 游標名稱%notfound
end loop;
close 游標名稱

案例

--打印業主類型為1的價格表
--查表語句
select * from t_pricetable where ownertypeid=1

--游標
declare
    cursor cur_pricetable is select * from t_pricetable where ownertypeid=1;--聲明游標
    v_pricetable t_pricetable%rowtype;
begin
    open cur_pricetable;
        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;

附:步驟

  1. PLSQL結構
  2. 聲明游標
  3. 打開--關閉游標
  4. 循環取記錄

帶參數的游標

? 聲明的時候指定參數的類型和名稱,打開游標的時候需要傳入指定類型的參數即可。

案例:

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 ;

For循環游標[掌握使用]

declare

begin
    for v_pricetable in cur_pricetable(3)
end

存儲函數/存儲過程

存儲函數

? Oracle中提供的使用PLSQL語言自定義的一些函數稱之為存儲函數

語法格式

CREATE [or replace] function 函數名稱
(參數名稱 參數類型,參數名稱 參數類型,...)
    return 結果變量數據類型
is
    變量聲明部分
begin
    邏輯部分
    return 結果變量
[Exception]
end;

案例

--通過ID查找小區
create or replace function fn_getaddress
(v_id number)
return varchar2;
is
    v_name varchar2(30);
begin
    --查詢地址表
    select name into v_name from t_address where id=v_id;
    return v_name;
end;

實際使用語句

select id,name,fn_getaddress(addressid) from t_owners

存儲過程

概念

? 存儲過程和存儲函數差不多,和存儲函數相比,它沒有返回值,可以通過傳出參數返回多個值;存儲過程不能在select語句中直接使用,它多數是被應用程序調用。

存儲過程與存儲函數都可以封裝一定的業務邏輯并返回結果,存在區別如下:

  1. 存儲函數中有返回值,且必須返回;而存儲過程沒有返回值,可以通過傳出參數返回多個值。
  2. 存儲函數可以在 select 語句中直接使用,而存儲過程不能。過程多數是被應用程序所調用。
  3. 存儲函數一般都是封裝一個查詢結果,而存儲過程一般都封裝一段事務代碼。

語法格式

create [or replace] procedure procedure名稱 (參數名 參數類型,...)
is[as]--都可以用
    變量聲明
begin
    具體邏輯
[Exception]
end;

參數只指定類型,不指定長度
過程參數的三種模式:
? IN 傳入參數(默認)
? OUT 傳出參數 ,主要用于返回程序運行結果
? IN OUT 傳入傳出參數

案例

--創建不帶傳出參數的存儲過程:添加業主信息
--增加業主信息
create or replace procedure pro_owners_add()

使用

--調用不帶參數的存儲過程
--一
call 存儲過程名(實際參數。。。);
--二
begin
    存儲過程的名稱(實參)
end;

用JDBC調用


--帶傳出參數的存儲過程
create or replace procedure pro_owners_add()

觸發器

? 已經淘汰,現在都用消息隊列

? 對特定表(增刪改---生產者消費者思想---中介思想)

概念: 數據庫觸發器就是一段sql程序

觸發器可用于

  • 數據確認
  • 實施復雜的安全性檢查
  • 做審計,跟蹤表上所做的數據操作等
  • 數據的備份和同步

觸發器的分類

  • 前置觸發器(BEFORE)
  • 后置觸發器(AFTER)

面向切面的AOP思想

創建觸發器的語法

create [or replace] trigger 觸發器名
    before|after
    [delete][[or] insert][[or]update[of 列名,...]]
    on 表名
    [for each row][when(條件)]
declare
    ...
begin
    PLSQL 塊
end;
--for each row的作用是標準此觸發器是行級觸發器,不寫的話是語句級觸發器
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,622評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,716評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,746評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,991評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,706評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,036評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,029評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,203評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,725評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,451評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,677評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,161評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,857評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,266評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,606評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,407評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,643評論 2 380

推薦閱讀更多精彩內容

  • 1.1 基本結構 PL/SQL程序由三個塊組成,即聲明部分、執行部分、異常處理部分。 1.2 命名規則 1.3 記...
    慢清塵閱讀 3,878評論 3 14
  • 第八章 數據查詢和選擇 ||| 第十章 獲取GIS數據列表和描述信息 我們將在本章中介紹以下幾個案例: 游標對象(...
    muyan閱讀 21,270評論 5 21
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,738評論 18 399
  • 數據庫編程 嵌入式 SQL 嵌入式 SQL 的處理過程將 SQL 語句嵌入到程序設計語言中 , 如 C,C++,J...
    iOS_愛OS閱讀 1,014評論 0 0
  • 跟同事去吃晚餐的路上,一路聊著,她說最近想搬家,原本三個人住的,現在她跟另外一個想搬出來,第三個又不想搬,如此一番...
    海水微涼淺喜深愛閱讀 338評論 0 0