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...