五 Oracle SQL(儲存過程)

2022-08-14 02:00:19 字數 3481 閱讀 5806

7.1.1 定義

所謂儲存過程,就是一段儲存在資料庫中執行某塊業務功能的程式模組。

它是由一段或者多段的pl/sql**塊或者sql語句組成的一系列**塊。

7.1.2 結構分析

create [or replace] procedure 過程名

( p1 in|out datatype,

p2 in|out datatype,

...pn in|out datatype

) is/as

....--宣告部分

begin

....--過程體

end;

ps:標紫色的語句去掉後就是無參形式的儲存過程

ps:在呼叫儲存過程時,=>前面的變數為儲存過程的形參且必須於儲存過程中定義的一致,而=>後的引數為實際引數。當然也不可以不定義變數儲存實參。

例:mydemo04(name=>name,age=>18)這種為正確的形參賦值,不能直接寫 mydemo04(name=>name,18),這是錯誤的寫法;

create [or replace]:如果儲存過程已經存在則覆蓋替代原有的過程。

procedure:建立儲存過程的命令。

in|out

datatype:表示出入參變數對應的資料型別。

is/as:後面跟著的是過程當中使用到的宣告變數。

begin...end:中間編寫的就是儲存過程的具體操作。

7.1.3 呼叫分析

假設現在有乙個無參儲存過程mydemo01(有參存過同理)需要呼叫

--方式1:宣告declare關鍵字呼叫

declare

begin

mydemo01;

end;

--方式2:不宣告declare關鍵字呼叫

begin

mydemo01; --在此處也可使用mydemo01();完成儲存過程的呼叫

end;

--方式3:使用call儲存過程名完成呼叫,注意括號不能少

call mydemo01();

--方式4:在command命令視窗執行

sql> set serveroutput on

sql> exec mydemo01

ps:1、在呼叫儲存過程時,如果儲存過程沒有引數,呼叫時括號()可以不帶。

2、儲存過程帶引數需要注意引數的傳遞引數時的一致性,按順序依次傳遞。

7.2.1 編寫儲存過程
--建立乙個儲存過程計算學生某乙個課程中成績在班中的排名,使用儲存過程進行計算,返回對應的排名

create or replace procedure sp_score_pm (

--學號

p_in_stuid in varchar2,

--課程id

p_in_courseid in varchar2,

--排名

p_out_pm out number

) is

--過程中使用的宣告變數:成績

ls_score number := 0 ;

--過程中使用的宣告變數:成績比該學生高的人數

ls_pm number := 0 ;

begin

--1.獲取該學生的成績

select

t .score into ls_score

from

score t

where

t .stuid = p_in_stuid

and t .courseid = p_in_courseid ;

--2.獲取成績比該學生高的人數

select

count (*) into ls_pm

from

score t

where

t .courseid = p_in_courseid

and t .score > ls_score ;

--3.得到該學生的成績排名

p_out_pm := ls_pm + 1 ;

exception

when no_data_found then

dbms_output.put_line (

'該學生的課程:' || p_in_courseid || '的成績在成績表中找不到'

) ;end ;

7.2.2 呼叫儲存過程
--在sql視窗執行編譯上面的**,編譯成功後,我們就可以呼叫儲存過程來獲取學生對應的課程成績排名了,

--儲存過程需要出入參賦值,因此我們可以通過pl/sql語句塊進行測試,**如下:

declare

ls_pm number;--排名

begin

--學號sc201801001的學生成績排名

sp_score_pm('sc201801001','r20180101',ls_pm);

dbms_output.put_line('學號:sc201801001,課程號:r20180101 的成績排名是:'||ls_pm);

sp_score_pm('sc201801001','r20180102',ls_pm);

dbms_output.put_line('學號:sc201801001,課程號:r20180102 的成績排名是:'||ls_pm);

--學號sc201801002的學生成績排名

sp_score_pm('sc201801002','r20180101',ls_pm);

dbms_output.put_line('學號:sc201801002,課程號:r20180101 的成績排名是:'||ls_pm);

sp_score_pm('sc201801002','r20180102',ls_pm);

dbms_output.put_line('學號:sc201801002,課程號:r20180102 的成績排名是:'||ls_pm);

end;

ps:本例中通過||符號達到連線字串的功能

7.3.1 降低總體開發成本。

儲存過程把實際執行的業務邏輯pl/sql塊和多條sql語句封裝到儲存過程當中,其它開發者只需要呼叫寫好的過程,獲取想要的結果,不需要重新理解業務。把業務抽取出來由專門的人來編寫。

7.3.2 增加資料的獨立性。

它的作用和檢視的作用類似,假如表的基礎資料發生變化,我們只需要修改過程當中的**,而不需要修改呼叫程式。使得使用者程式不需要直接面對基礎資料進行編寫**。使得**內聚程度更高,耦合度更低。

7.3.3 提高效能。

實際開發過程中,乙個業務模組功能的開發可能需要用到多個sql語句,多個pl/sql程式塊才能解決問題。把它編寫進過程,oracle只需要一次編譯,以後隨時可以呼叫。如果不使用過程,直接把許多sql語句寫程序式當中,需要多次編譯,而且需要多次連線資料庫,大大的降低了效能。

**自:有夢想的肥宅

oracle sql 解析過程

解析有兩種 硬解析和軟解析 parse 1 從共享池的庫緩衝區中搜尋,該語句是否曾經執行過,凡是執行過的sql語句,oracle會使用hash函式進行計算,產生乙個很小的文字記錄,如果是第一次執行,則進入第二步。2 檢查語句 許可權等等 許可權資訊是存放在oracle的資料字典中,oracle先從共...

Oracle sql執行過程

每種型別的語句都要執行的全過程 1 create a cursor 建立游標 2 parse the statement 分析語句 5 bind any variables 繫結變數 7 run the statement 執行語句 9 close the cursor 關閉游標 如果使用了並行功能...

五 儲存過程

儲存過程 儲存過程是在大型資料庫系統中,一組為了完成特定功能的sql 語句集,經編譯後儲存在資料庫中,使用者通過指定儲存過程的名字並給出引數 如果該儲存過程帶有引數 來執行它。建立儲存過程 create procedure procedue name parameter data type outp...