1. 程式人生 > >(ORACLE)PL/SQL 程式設計

(ORACLE)PL/SQL 程式設計

識別符號的規範

1、定義變數,用v_作為字首

2、定義常量,用c_作為字首

3、定義遊標,用_cursor作為字尾

4、定義列外,用e_作為字首

塊(block)

PL\SQL的程式基本單元

編寫PL\SQL程式,其實就是在編寫PL\SQL塊,要完成相對簡單的功能。可能只需要編寫一個PL\SQL快;但要想實現複雜的功能,可能需要在一個PL\SQL塊中巢狀其他的PL\SQL塊。

塊的分類

1、過程(儲存過程)

2、函式

3、觸發器

4、包

塊的結構

PL\SQL塊是由三個部分組成的

1、定義部分

declare 定義常量,變數,遊標,列外,複雜資料型別

2、執行部分

begin 執行PL\SQL語句和SQL語句

3、列外處理部分

exception 處理執行的各種錯誤

end;

定義部分是從declear開始的,這部分是可選的

執行部分是從begin開始的e,這部分是必選的

處理部分是從exception開始的,這部分也是可選的

declare
begin
	內容
end;

例1、執行部分的塊

在這裡插入圖片描述

例2、定義和執行部分的塊

在這裡插入圖片描述

在這裡插入圖片描述

如果需要賦值多個變數名,多個變數名與欄位之間,用‘,’號分隔開

(這裡有個坑,例3講)

在這裡插入圖片描述

例3、定義塊部分,執行塊部分,列外處理部分

例2中如果輸入的值,沒有找到對應的資料,程式會丟擲異常,這裡就需要用到列外處理部分(異常處理)

在這裡插入圖片描述

過程

過程用於執行特定的操作,當建立過程時,既可以指定輸入引數(in)也,可以指定輸出引數(out)。通過在過程中使用輸出引數,可以將資料傳遞到執行部分;通過使用輸出引數,可以將執行部分的資料,傳遞到應用環境中。可以使用create procedure 命令來建立過程

建立儲存過程

在這裡插入圖片描述

遍寫一個過程,根據員工姓名,修改員工工資

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

使用java呼叫儲存過程

在這裡插入圖片描述

函式

函式是用於返回特定的資料,在建立函式的時候,函式頭部必須包含return子句,在函式體內必須包含return語句的返回資料,我們可以使用cerate function 來建立函式。

建立函式

在這裡插入圖片描述

使用SQL PULS呼叫函式

在這裡插入圖片描述
在這裡插入圖片描述

包是用於在邏輯上組合過程和函式,他是有包規範和包體兩部分組成

1、使用create package is 命令來建立包

建立的包裡只有宣告的過程和函式,沒有具體的實現過程

在這裡插入圖片描述

2、使用 create package body 包名 is 來建立包體

用來實現剛才建立的包內的過程和函式的具體實現步驟

在這裡插入圖片描述

呼叫包中的過程

使用exec 包名.過程名呼叫

在這裡插入圖片描述

觸發器

觸發器是指隱含執行的儲存過程,當定義出發器時,必須要指定觸發器的事件和觸發的操作,常用的觸發事件包括insert,update,delete語句,而觸發操作,實際上就是一個pl/sql塊可以使用create trigger 來建立觸發器

變數的型別

1、標量型別 scalar

2、複合型別composite

3、參照型別reference

4、lob(large object)

標量(scalar)

在定義好變數後,就可以使用的變數。使用:=賦值。

存放單個數據。

輸入員工的編號,查詢姓名,工資 和稅後工資

在這裡插入圖片描述

標量(scalar)%type型別

根據列的型別,來確定變數的型別和長度

使用方法:

識別符號名 表名.列名%type;

在這裡插入圖片描述

複合變數(composite)

用於存放多個值的變數,主要包括這幾種

PL/SQL記錄

PL/SQL表

巢狀表

varray(變長陣列)

複合型別-PL/SQL --記錄–

類似於java當中的類

把A物件中的元素,篩選出自己需要的元素,建立一個B物件,根據篩選條件,從A物件中篩選元素相應的值,同時在B物件的元素中體現。

在這裡插入圖片描述

複合型別-PL/SQL --表–

相當於java中的陣列

java中的陣列下標不能為負數,PL/SQL表的下標是可以為負數的,並且表元素的小標沒有限制

在這裡插入圖片描述

參照變數

參照變數是指存放數值指標的變數,通過使用參照變數可以使應用程式共享相同的物件,從而降低佔用的空間,在編寫PL/SQL程式時,可以使用遊標變數(ref cursor)和物件型別變數(ref obj_type)兩種參照型別變數

遊標變數(ref cursor)

使用遊標時,當定義遊標時不需要指定相應的select語句,但是當使用遊標時(open時)需要指定select語句,這樣一個select語句就和一個遊標結合了

編寫一個PL/SQL塊,可以輸入部門號,顯示該部門所有員工姓名和他的工資

在這裡插入圖片描述

PL/SQL 控制結構

條件分支語句

1、if—then

2、if—then—else

3、if—then—elsif—else

判斷全部完成後使用end if 結束判斷

————————————

1、簡單條件判斷

if—then—

編寫一個過程,輸入員工姓名,如果工資低於2000,工資上漲10%

在這裡插入圖片描述

2、二重條件分支

if—then—else—

輸入員工姓名,如果補助不為0,將補助在原有的基礎上加100,如果補助為0,就把補助設為200

3、多重條件分支

if—then—elsif—else

輸入員工編號,如果職位是president 就給他工資加1000,如果職位是manager加500,其他職位加200

在這裡插入圖片描述

迴圈語句

loop

loop是PL/SQL中最簡單的迴圈語句,以loop開頭,end loop結尾,

這種迴圈至少會被執行一次

exit when後面跟退出迴圈的條件

寫一個過程,輸入一個使用者名稱,在使用者表中迴圈新增10次

在這裡插入圖片描述
在這裡插入圖片描述

while迴圈

當條件為ture時,執行迴圈體的語句

以while。條件。loop開始

end loop結束

使用while迴圈 寫一個過程,輸入一個使用者名稱,在使用者表中迴圈新增10次

在這裡插入圖片描述

for迴圈

基本for迴圈

控制變數 i 在隱含中不停增加

在這裡插入圖片描述

java程式呼叫 有返回值的儲存過程

輸入員工編號,返回員工的姓名

在這裡插入圖片描述

在這裡插入圖片描述

Java程式 呼叫返回多個引數的儲存過程

在這裡插入圖片描述

在這裡插入圖片描述

返回結果集的儲存過程

輸入部門號,返回該部門所有僱員的資訊

由於oracle 儲存過程沒有返回值,他的所有引數都是通過out引數來代替,所以要用到列表,由於是集合,所以這裡要用-包-package

1、建立一個包,定義一個遊標,再建立一個返回多條結果的儲存過程

在這裡插入圖片描述

2、使用Java程式呼叫儲存過程

儲存過程返回的是 遊標cursor 說明返回的是多條結果,每一條結果都是一個object物件,在使用ResultSet接收的時候需要向下轉型

在這裡插入圖片描述

分頁過程

分頁模板

使用rownum欄位,查詢emp表中 3-5條記錄

select * from (select t1.*,rownum rn from (select * from emp) t1 where rownum <=5) where rn between 3 and 5;

1、在包中先建立遊標

在這裡插入圖片描述

2、編寫一個儲存過程,傳入三個引數分別是 表名,查詢頁數,和每頁顯示的資料數量;返回三個引數,分別是,分頁頁數,查詢到資訊的總數,每頁顯示的具體資訊。

在這裡插入圖片描述
在這裡插入圖片描述

3、在java中呼叫儲存過程,查詢自己想要的資料

在這裡插入圖片描述
在這裡插入圖片描述

例外處理(異常處理)

Oracle將例外分為

1、預定義例外

       用於處理常見的Oracle錯誤

2、非預定義例外

       用於處理預定義例外不能處理的錯誤

3、和自定例外

      用於處理和Oracle錯誤無關的其他情況

處理預定義例外

預定義例外是由pl/sql所提供的系統例外,當pl/sql應用程式違反了oracle規定的限制是,則會隱含的觸發一個內部列外。pl/sql為開發人員提供了二十多個預定義例外。

case not found

cursor_already_open

dup_val_on_index

invaild_cursor

invaild_number

在這裡插入圖片描述

自定義例外

由開發人員自己定義的例外

編寫一個pl/sql塊 接收一個僱員編號,並給該僱員工資增加1000元,如果該僱員不存在,給出提示

在這裡插入圖片描述