日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

(Oracle学习笔记) PL/SQL编程语言

發(fā)布時(shí)間:2025/3/20 数据库 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (Oracle学习笔记) PL/SQL编程语言 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 一、PL/SQL塊結(jié)構(gòu)
  • 二、注釋
  • 三、數(shù)據(jù)類型
    • Number(p,s)
    • %TYPE
    • Record
    • %ROWTYPE
  • 四、選擇語句
    • If......then
    • If....then.....else
    • If....then....elsif......then....else
    • Case語句
  • 五、循環(huán)語句
    • Loop
    • While
    • For
  • 六、游標(biāo)
    • 顯式游標(biāo):
    • 隱式游標(biāo)
    • 遍歷隱式游標(biāo)
    • 遍歷顯式游標(biāo)
  • 七、存儲(chǔ)過程
    • 存儲(chǔ)過程創(chuàng)建
    • 存儲(chǔ)過程參數(shù)
      • IN
      • Out
      • IN OUT
      • 刪除存儲(chǔ)過程
  • 八、異常處理
    • 使用oracle預(yù)處理異常
    • 自定義異常:錯(cuò)誤編號(hào)異常
    • Raise主動(dòng)拋出異常
  • 九、觸發(fā)器
    • 語句級(jí)觸發(fā)器
    • 行級(jí)別觸發(fā)器
    • 用戶事件觸發(fā)器
    • 刪除觸發(fā)器
  • 十、視圖
    • 創(chuàng)建簡(jiǎn)單視圖
    • 復(fù)雜視圖
    • 連接視圖
    • 刪除視圖

一、PL/SQL塊結(jié)構(gòu)

(1)聲明部分(DECLARE)開始(可選),到BEGIN關(guān)鍵字結(jié)束,這一部分可以聲明PL/SQL程序塊中所用到的變量、常量和游標(biāo)等。
注:再某個(gè)PL/SQL塊中聲明的內(nèi)容,只能在當(dāng)前塊中使用
(2)執(zhí)行部分(BEGIN)開始(必須有),結(jié)束方式有兩種。如果語句塊中運(yùn)行出現(xiàn)異常,則執(zhí)行異常處理部分的代碼結(jié)束。如果代碼塊沒有異常,則以執(zhí)行到END關(guān)鍵字結(jié)束。
(3)異常處理部分(EXCEPTION),語句塊出現(xiàn)異常時(shí)執(zhí)行該部分,執(zhí)行結(jié)束后,整個(gè)PL/SQL語句塊執(zhí)行結(jié)束。

注:每一條語句都必須以分號(hào)結(jié)束,每條SQL語句可以寫成多行,以分號(hào)結(jié)束;

二、注釋

單行注釋 –
多行注釋 /。。。。。/

三、數(shù)據(jù)類型

Number(p,s)

p標(biāo)識(shí)精度(所有有效數(shù)字) s標(biāo)識(shí)刻度范圍(小數(shù)點(diǎn)右邊的位數(shù))

Char長度固定,最大2000字節(jié)
Varchar2長度不固定,最大4000字節(jié)
Long長度不固定,最大32767字節(jié)

%TYPE

優(yōu)點(diǎn)
(1)用戶不必查看表結(jié)構(gòu)中各列的數(shù)據(jù)類型就可以定義保存某列值的變量
(2)如果對(duì)表中列的類型進(jìn)行修改,無需考慮更改pl/sql語句塊中定義的變量類型
Select…into 對(duì)變量進(jìn)行賦值

Record

存儲(chǔ)由多列組成的一行數(shù)據(jù),是一種結(jié)構(gòu)化的數(shù)據(jù)類型,使用type語句進(jìn)行定義

%ROWTYPE

結(jié)合了%TYPE和RECORD變量的優(yōu)點(diǎn),可以根據(jù)數(shù)據(jù)表中行的結(jié)構(gòu),定義一種特殊的數(shù)據(jù)類型,用來存儲(chǔ)從數(shù)據(jù)表中檢索到的一行數(shù)據(jù)

declare --定義能夠存儲(chǔ)emp表中一行數(shù)據(jù)的變量row_emp emp%rowtype;begin--檢索數(shù)據(jù)存儲(chǔ)到定義的變量select * into row_empfrom empwhere empno = 7369;--輸出查詢的數(shù)據(jù)dbms_output.put_line('雇員'||row_emp.ename||'的編號(hào)'||row_emp.empno||'職務(wù)是'||row_emp.job);end;

四、選擇語句

If…then

只做一種情況條件判斷

declarevar_name1 varchar2(50);var_name2 varchar2(50);beginvar_name1 := 'AAA';var_name2 := 'BB';if length(var_name1) > length(var_name2) thendbms_output.put_line('字符串'||var_name1||'的長度比字符串'||var_name2||'的長度大');end if;end;

If…then…else

可以實(shí)現(xiàn)判斷兩種情況分支

declareage int := 20;begin if age >= 18 then dbms_output.put_line('你已經(jīng)老了');else dbms_output.put_line('你還年輕');end if;end;

If…then…elsif…then…else

實(shí)現(xiàn)多分支選擇語句

declare--定義月份變量month int; begin--獲取系統(tǒng)當(dāng)前時(shí)間月份,賦值給month變量select to_char(sysdate,'MM')into monthfrom dual;--判斷是第幾季度if month >= 1 and month <=3 thendbms_output.put_line('這是第一季度');elsif month >=4 and month <=6 thendbms_output.put_line('這是第二季度');elsif month >=7 and month <=9 thendbms_output.put_line('這是第三季度');elsif month >=10 and month <=12 thendbms_output.put_line('這是第一季度');elsedbms_output.put_line('月份不符合要求');end if; end;

Case語句

與elseif類似,case后面通常是一個(gè)變量

declareseason int :=3;info varchar2(50); begincase seasonwhen 1 then info := '季度包含1,2,3月份';when 2 then info := '季度包含4,5,6月份';when 3 then info := '季度包含7,8,9月份';when 4 then info := '季度包含10,11,12月份';else info := '季度不合法';end case;dbms_output.put_line(info); end;

五、循環(huán)語句

Loop

Loop語句會(huì)先執(zhí)行一次循環(huán)體,然后判斷‘EXIT WHEN’關(guān)鍵字后面的條件表達(dá)式,若為true則退出循環(huán)體,否則繼續(xù)執(zhí)行循環(huán)體,所以loop至少執(zhí)行一次循環(huán)體

declare--定義整數(shù)變量,存儲(chǔ)整數(shù)和sum_i int := 0;--定義整數(shù)變量,存儲(chǔ)自然數(shù)i int := 0; begin--循環(huán)累加loop--給自然數(shù)賦值i := i+1;--計(jì)算前n個(gè)自然數(shù)的和sum_i := sum_i+i;--當(dāng)循環(huán)100次時(shí),程序退出循環(huán)體exit when i = 100;end loop;dbms_output.put_line('前100個(gè)自然數(shù)之和為:'||sum_i); end;

While

執(zhí)行0次或多次循環(huán)體,在每次執(zhí)行循環(huán)體之前,首先判斷條件表達(dá)式的值是否為true,若為true在執(zhí)行循環(huán)體語句,否則退出循環(huán)體

declaresum_i int := 0;i int :=0;beginwhile i <= 100 loopi := i+1;sum_i := sum_i + i;end loop;dbms_output.put_line(sum_i);end;

For

For語句是一個(gè)可以預(yù)置循環(huán)次數(shù)的循環(huán)控制語句,它有一個(gè)循環(huán)計(jì)數(shù)器,通常是一個(gè)整型變量,通過這個(gè)循環(huán)計(jì)數(shù)器來控制循環(huán)次數(shù)

declaresum_i int := 0;beginfor i in reverse 1..100 loop--判斷是否為偶數(shù)if mod(i,2) = 0 thensum_i := sum_i + i;end if;end loop;dbms_output.put_line('和為'||sum_i);end;

六、游標(biāo)

顯式游標(biāo):

聲明游標(biāo)
主要包括游標(biāo)名和為游標(biāo)提供結(jié)果集的select語句,因此聲明游標(biāo)時(shí)必須指定游標(biāo)名和游標(biāo)所使用的select語句

打開游標(biāo)
游標(biāo)聲明完之后,必須打開才能使用
Open 游標(biāo)名稱[()],當(dāng)省略參數(shù)后,傳入的就為默認(rèn)值

讀取游標(biāo)
讀取游標(biāo)就是逐行將結(jié)果集中的數(shù)據(jù)保存到變量中處理。
Fetch cur_name into(variable)
Variable:一個(gè)變量列表或‘記錄’變量(record類型)
%found:布爾值,存在值為true,否則為false

關(guān)閉游標(biāo)
Close cur_name;
實(shí)例:

declare --聲明游標(biāo)cursor cur_emp(var_job in varchar2 := 'SALESMAN')is select empno,ename,salfrom empwhere job = var_job;--聲明一個(gè)記錄類型,用于存放游標(biāo)每行的值type reco_emp is record(var_empno emp.empno%type,var_ename emp.ename%type,var_sal emp.sal%type);--聲明一個(gè)reco_emp類型的變量emp_row reco_emp; begin--打開游標(biāo)open cur_emp('MANAGER');--先讓指針指向結(jié)果集中的第一行fetch cur_emp into emp_row;while cur_emp%found loopdbms_output.put_line(emp_row.var_ename||'編號(hào)是'||emp_row.var_empno||'工資為'||emp_row.var_sal);fetch cur_emp into emp_row;end loop;--關(guān)閉游標(biāo)close cur_emp; end;

隱式游標(biāo)

將emp表中銷售員的工資上調(diào)20%,然后使用隱式游標(biāo)sql的%rowcount屬性輸出上調(diào)員工的數(shù)量
%rowcount受sql語句影響的行數(shù)

begin update empset sal = sal*1.2where job = 'SALESMAN';if sql%notfound thendbms_output.put_line('沒有雇員需要上調(diào)工資');elsedbms_output.put_line('有'||sql%rowcount||'個(gè)雇員工資上調(diào)20%');end if;end;

遍歷隱式游標(biāo)


遍歷顯式游標(biāo)


七、存儲(chǔ)過程

存儲(chǔ)過程創(chuàng)建



存儲(chǔ)過程參數(shù)

IN



Out

IN OUT

刪除存儲(chǔ)過程


drop procedure pro_square;

八、異常處理

使用oracle預(yù)處理異常


自定義異常:錯(cuò)誤編號(hào)異常


自定義異常:業(yè)務(wù)邏輯異常

Raise主動(dòng)拋出異常


九、觸發(fā)器

語句級(jí)觸發(fā)器


行級(jí)別觸發(fā)器

用戶事件觸發(fā)器

刪除觸發(fā)器


drop trigger tri_ddl_oper;

十、視圖

創(chuàng)建簡(jiǎn)單視圖

復(fù)雜視圖

復(fù)雜視圖指包括函數(shù)、表達(dá)式或分組數(shù)據(jù)的視圖

連接視圖

連接視圖指基于多個(gè)表所建立的視圖。使用連接視圖主要目的是為了簡(jiǎn)化連接查詢。需要注意,連表查詢時(shí),必須使用where子句指定有效的連接條件,否則結(jié)果就是毫無意義的笛卡爾積

刪除視圖

drop view emp_view_uni;

總結(jié)

以上是生活随笔為你收集整理的(Oracle学习笔记) PL/SQL编程语言的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。