PL/SQL之存儲過程

存儲過程、存儲函數和觸發器

  • 存儲過程和存儲函數
    定義:指存儲在數據庫中供所有用戶程序調用的子程序叫存儲過程或存儲函數。
    區別:存儲函數可以同return number(類型)這種方式來返回一個值(且只能返回一個)
  • 觸發器
    觸發器是一個與表相關聯的、存儲的PL/SQL程序
  • 存儲過程、存儲函數和觸發器執行前都需要編譯(直接在pl/sql developer中執行程序)

存儲過程

  • 存儲過程的用途及使用場景:

    • 存儲過程只在創造時進行編譯,以后每次執行存儲過程都不需再重新編譯,
      而一般 SQL 語句每執行一次就編譯一次,所以使用存儲過程可提高數據庫執行速度。
    • 當對數據庫進行復雜操作時(如對多個表進行 Update,Insert,Query,Delete 時),
      可將此復雜操作用存儲過程封裝起來與數據庫提供的事務處理結合一起使用。
      這些操作,如果用程序來完成,就變成了一條條的 SQL 語句,可能要多次連接數據庫。
      而換成存儲,只需要連接一次數據庫就可以了。
    • 存儲過程可以重復使用,可減少數據庫開發人員的工作量。
    • 安全性高,可設定只有某此用戶才具有對指定存儲過程的使用權
  • 用CREATE PROCEDURE命令創建存儲過程

  • 語法:
    <pre>
    create [or replace] procedure 過程名(參數列表)
    AS
    -- AS相當于PLSQL程序中的declare,AS關鍵字不可以省略,
    declare可以在沒有聲明任何變量/cursor/exception時可以省略。
    PLSQL子程序體
    </pre>

  • 示例


    調用方式:
    1.execute sayHelloWorld();
    2.begin
    sayHelloWorld();
    sayHelloWorld();
    end;


  • PL/SQL Developer中調試存儲過程/存儲函數:
    右鍵存儲過程 -> 添加調試信息(√) -> 測試


    調試過程中可能出現以下錯誤

    意思是當前賬號沒有調試權限,在命令窗口使用system登錄授權:grant DEBUG CONNECT SESSION , DEBUG ANY PROCEDURE to scott(當前賬號);

存儲函數

存儲過程和存儲函數中的IN/OUT

    一般來講,過程和函數的區別在于函數可以有一個返回值,而過程沒有返回值。

但過程和函數都可以通過out指定一個或多個輸出參數。我們可以利用out參數在過程和函數中實現返回多個值。那么問題來了,存儲函數還有什么鳥用?其作用就是兼容低版本的Oracle。
<pre> 參數傳遞方式:IN,OUT,IN OUT
IN : 表示輸入參數,按值傳遞方式。
特點:它不允許在存儲過程中被重新賦值(相當于java中final修飾的參數)。
如果存儲過程的參數沒有指定參數傳遞類型,默認為IN

OUT : 表示輸出參數,可以理解為按引用傳遞方式。可以作為存儲過程的輸出結果,供外部調用者使用。
 特點:當一個參數被指定為OUT類型時,就算在調用存儲過程之前對該參數進行了賦值,
 在存儲過程中該參數的值仍然是null。
                 
IN OUT : 即可作輸入參數,也可作輸出參數。
特點:是真正的按引用傳遞參數。即可作為傳入參數也可以作為傳出參數。  

</pre>
存儲過程/存儲函數分別在什么時候用?
原則:如果只有一個返回值,用存儲函數,否則就用存儲過程。

-- 存儲過程返回多個值
-- 查詢某個員工的姓名,職位和月薪
create or replace procedure queryEmpInfo(eno    in  number,
                                     pename out     varchar2,
                                     pjob   out     varchar2,
                                     psal   out     number)
as
begin
     select ename,empjob,sal into pename,pjob,psal from emp where empno = eno;
end;

觸發器

  • 數據庫觸發器是一個與表相關聯的、存儲的PL/SQL程序。
    每當一個特定的數據操作語句(insert,update,delete)在指定的表上發出時,
    Oracle自動地執行觸發器中定義的語句序列。
  • 觸發器的類型
    • 語句級觸發器:在指定的操作語句之前或之后執行一次,不管這條語句響應了多少行。其實就是針對表
    • 行級觸發器(FOR EACH ROW):觸發語句作用的每一條記錄都被觸發。其實就是針對表中的行。
      在行級觸發器中使用:old和:new偽記錄變量識別值的狀態。
    • 如何區分:就看程序中有沒有FOR EACH ROW這句代碼
  • 觸發器的應用場景
    • 數據確認
    • 實施復雜的安全性檢查
    • 做審計,跟蹤表上的所有的數據操作等
    • 數據的備份和同步
  • 查詢觸發器、存儲過程及存儲函數
    • select * from user_triggers;
    • select * from user_source;
  • 語法
    <pre>
    CREATE [OR REPLACE] TRIGGER 觸發器名
    {BEFORE | AFTER}
    {INSERT | DELETE | UPDATE[OF 列名]}
    ON 表名
    [FOR EACH ROW [WHEN 條件]]
    DECLARE
    BEGIN
    END;
    -- []:表示可有可無,|:表示多個中可選一個
    -- 注意:UPATE[OF 列名] 如果加上列名表示更新指定的列
    </pre>
  • 示例





最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,923評論 6 535
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,740評論 3 420
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,856評論 0 380
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,175評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,931評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,321評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,383評論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,533評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,082評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,891評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,067評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,618評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,319評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,732評論 0 27
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,987評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,794評論 3 394
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,076評論 2 375

推薦閱讀更多精彩內容

  • 1.1 基本結構 PL/SQL程序由三個塊組成,即聲明部分、執行部分、異常處理部分。 1.2 命名規則 1.3 記...
    慢清塵閱讀 3,872評論 3 14
  • 方案簡介Toad――加速你的數據庫設計、開發、測試和管理數據庫的優異性能和高可用性源自于良好的數據庫設計,Ques...
    layjoy閱讀 6,611評論 1 14
  • 語 句 功 能 數據操作 SELECT——從數據庫表中檢索數據行和列INSERT——向數據庫表添加新數據行DELE...
    戰敭閱讀 5,111評論 0 53
  • 原創文章,首發自作者個人博客Jason's Blog。轉載請務必在文章開頭處注明出自Jason's Blog,并給...
    郭俊Jason閱讀 5,937評論 3 29
  • 去三亞前,父親和我提起,說:“南山寺是個不錯的地方,你可以去看看。” 父親極少夸獎什么,他若說不錯,那大抵就真的不...
    飛過天空閱讀 226評論 0 0