oracle存儲(chǔ)過(guò)程的作用有哪些

oracle存儲(chǔ)過(guò)程的作用有:1、簡(jiǎn)化復(fù)雜的操作,降低總體開(kāi)發(fā)成本;2、增加數(shù)據(jù)獨(dú)立性;3、可以有效降低錯(cuò)誤出現(xiàn)的幾率,提高安全性;4、提高性能。

oracle存儲(chǔ)過(guò)程的作用有哪些

本教程操作環(huán)境:Windows7系統(tǒng)、Oracle 11g版、Dell G3電腦。

Oracle存儲(chǔ)過(guò)程在實(shí)際數(shù)據(jù)庫(kù)開(kāi)發(fā)過(guò)程當(dāng)中會(huì)經(jīng)常使用到,作為一個(gè)數(shù)據(jù)庫(kù)開(kāi)發(fā)者必備的技能,它有著SQL語(yǔ)句不可替代的作用。所謂存儲(chǔ)過(guò)程,就是一段存儲(chǔ)在數(shù)據(jù)庫(kù)中執(zhí)行某塊業(yè)務(wù)功能的程序模塊。它是由一段或者多段的PL/SQL代碼塊或者SQL語(yǔ)句組成的一系列代碼塊。

存儲(chǔ)過(guò)程的作用(優(yōu)點(diǎn)):

  • 簡(jiǎn)化復(fù)雜的操作,降低總體開(kāi)發(fā)成本。

    存儲(chǔ)過(guò)程把實(shí)際執(zhí)行的業(yè)務(wù)邏輯PL/SQL塊和多條SQL語(yǔ)句封裝到存儲(chǔ)過(guò)程當(dāng)中,其它開(kāi)發(fā)者只需要調(diào)用寫(xiě)好的過(guò)程,獲取想要的結(jié)果,不需要重新理解業(yè)務(wù)。把業(yè)務(wù)抽取出來(lái)由專(zhuān)門(mén)的人來(lái)編寫(xiě)。

  • 增加數(shù)據(jù)獨(dú)立性。

    它的作用和視圖的作用類(lèi)似,假如表的基礎(chǔ)數(shù)據(jù)發(fā)生變化,我們只需要修改過(guò)程當(dāng)中的代碼,而不需要修改調(diào)用程序。使得用戶程序不需要直接面對(duì)基礎(chǔ)數(shù)據(jù)進(jìn)行編寫(xiě)代碼。使得代碼內(nèi)聚程度更高,耦合度更低。

  • 提高安全性。

    使用存儲(chǔ)過(guò)程有效降低了錯(cuò)誤出現(xiàn)的幾率。如果不使用存儲(chǔ)過(guò)程要實(shí)現(xiàn)某項(xiàng)操作可能需要執(zhí)行多條單獨(dú)的SQL語(yǔ)句,而過(guò)多的執(zhí)行步驟很可能造成更高的出現(xiàn)錯(cuò)誤幾率。

  • 提高性能。

    實(shí)際開(kāi)發(fā)過(guò)程中,一個(gè)業(yè)務(wù)模塊功能的開(kāi)發(fā)可能需要用到多個(gè)SQL語(yǔ)句,多個(gè)PL/SQL程序塊才能解決問(wèn)題。把它編寫(xiě)進(jìn)過(guò)程,Oracle只需要一次編譯,以后隨時(shí)可以調(diào)用。如果不使用過(guò)程,直接把許多SQL語(yǔ)句寫(xiě)進(jìn)程序當(dāng)中,需要多次編譯,而且需要多次連接數(shù)據(jù)庫(kù),大大的降低了性能。

創(chuàng)建Oracle存儲(chǔ)過(guò)程語(yǔ)法:

create?[or?replace]?procedure?過(guò)程名 (?p1?in|out?datatype, ??p2?in|out?datatype, ??... ??pn?in|out?datatype ???? )?is? ???? ????....--聲明部分 ????begin ???? ????....--過(guò)程體 ????end;

語(yǔ)法解析:

1、procedure 關(guān)鍵字是創(chuàng)建存儲(chǔ)過(guò)程的命令。

2、create [or replace] :如果存儲(chǔ)過(guò)程已經(jīng)存在則覆蓋替代原有的過(guò)程。

3、in|out :存儲(chǔ)過(guò)程具有入?yún)⒑统鰠煞N參數(shù)選擇,in表示的是入?yún)?,out表示的是出參,在使用過(guò)程的時(shí)候,入?yún)⒈仨毜糜袑?duì)應(yīng)的變量傳入,出參得有對(duì)應(yīng)的變量接收。

4、datatype表示出入?yún)⒆兞繉?duì)應(yīng)的數(shù)據(jù)類(lèi)型。

5、is后面跟著的是過(guò)程當(dāng)中使用到的聲明變量。

6、begin…end 中間編寫(xiě)的就是存儲(chǔ)過(guò)程的具體操作。

例子1、創(chuàng)建一個(gè)存儲(chǔ)過(guò)程計(jì)算學(xué)生某一個(gè)課程中成績(jī)?cè)诎嘀械呐琶褂么鎯?chǔ)過(guò)程進(jìn)行計(jì)算,返回對(duì)應(yīng)的排名,代碼如下:

create?or?replace?procedure?sp_score_pm( p_in_stuid?in?varchar2,--學(xué)號(hào) p_in_courseid?in??varchar2,?--課程ID p_out_pm?out?number--排名 ) is ls_score?number:=0; ls_pm?number:=0; begin ??--獲取該學(xué)生的成績(jī) ??select?t.score?into?ls_score?from?score?t ???where?t.stuid?=?p_in_stuid ?????and?t.courseid?=?p_in_courseid; ??--獲取成績(jī)比該學(xué)生高的人數(shù) ??select?count(1)?into?ls_pm?from?score?t ???where?t.courseid?=?p_in_courseid ???and??t.score>ls_score; ???--得到該學(xué)生的成績(jī)排名 ???p_out_pm:=ls_pm+1; exception ??when?no_data_found??then ?????dbms_output.put_line('該學(xué)生的課程:'||p_in_courseid||?'的成績(jī)?cè)诔煽?jī)表中找不到'); end;

通過(guò)上面的代碼,我們可以直接在SQL窗口執(zhí)行編譯,編譯成功后,我們就可以調(diào)用存儲(chǔ)過(guò)程來(lái)獲取學(xué)生對(duì)應(yīng)的課程成績(jī)排名了,存儲(chǔ)過(guò)程需要出入?yún)①x值,因此我們可以通過(guò)PL/SQL語(yǔ)句塊進(jìn)行測(cè)試,代碼如下:

declare ls_pm?number;--排名 begin ??--SC201801001 ??sp_score_pm('SC201801001','R20180101',ls_pm); ??dbms_output.put_line('學(xué)號(hào):SC201801001,課程號(hào):R20180101?的成績(jī)排名是:'||ls_pm); ??sp_score_pm('SC201801001','R20180102',ls_pm); ??dbms_output.put_line('學(xué)號(hào):SC201801001,課程號(hào):R20180102?的成績(jī)排名是:'||ls_pm); ??--SC201801002 ??sp_score_pm('SC201801002','R20180101',ls_pm); ??dbms_output.put_line('學(xué)號(hào):SC201801002,課程號(hào):R20180101?的成績(jī)排名是:'||ls_pm); ??sp_score_pm('SC201801002','R20180102',ls_pm); ??dbms_output.put_line('學(xué)號(hào):SC201801002,課程號(hào):R20180102?的成績(jī)排名是:'||ls_pm); ?? end;

結(jié)果如下:

oracle存儲(chǔ)過(guò)程的作用有哪些

推薦教程:《Oracle教程

以上就是

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊9 分享
站長(zhǎng)的頭像-小浪學(xué)習(xí)網(wǎng)月度會(huì)員