Oracle存儲(chǔ)過(guò)程與存儲(chǔ)函數(shù)-入門

文章思維導(dǎo)圖
一. 存儲(chǔ)過(guò)程和存儲(chǔ)函數(shù)的定義
  • 定義:存儲(chǔ)在數(shù)據(jù)庫(kù)中匣屡,供所有用戶程序調(diào)用的子程序叫做存儲(chǔ)過(guò)程/存儲(chǔ)函數(shù)屯仗。復(fù)雜點(diǎn)的解釋:存儲(chǔ)過(guò)程(Stored Procedure)佛南,就是一組用于完成特定數(shù)據(jù)庫(kù)功能的SQL 語(yǔ)句集晃酒,該SQL語(yǔ)句集經(jīng)過(guò)編譯后存儲(chǔ)在數(shù)據(jù)庫(kù)系統(tǒng)中故源。在使用時(shí)候,用戶通過(guò)指定已經(jīng)定義的存儲(chǔ)過(guò)程名字并給出相應(yīng)的存儲(chǔ)過(guò)程參數(shù)來(lái)調(diào)用并執(zhí)行它账千,從而完成一個(gè)或一系列的數(shù)據(jù)庫(kù)操作侥蒙。

  • 區(qū)別:是否可以通過(guò)return返回函數(shù)值。
    存儲(chǔ)函數(shù)可以通過(guò)return返回函數(shù)值匀奏;而存儲(chǔ)過(guò)程不可以鞭衩。

  • 注意:由于通過(guò)out參數(shù),存儲(chǔ)過(guò)程也可以返回函數(shù)值娃善,所以存儲(chǔ)過(guò)程和存儲(chǔ)函數(shù)已經(jīng)沒(méi)有太大的區(qū)別了论衍。而存儲(chǔ)函數(shù)仍然存在,是由于oracle不斷升級(jí)聚磺,需要實(shí)現(xiàn)向下兼容坯台,所以存儲(chǔ)函數(shù)就一直存留著。

二. 存儲(chǔ)過(guò)程
1. 創(chuàng)建和使用存儲(chǔ)過(guò)程

create procedure命令建立存儲(chǔ)過(guò)程瘫寝,語(yǔ)法如下:

create [or replace] procedure 過(guò)程名(參數(shù)列表)
as   -- as不可以省略
PLSQL子程序體;

注意事項(xiàng):
1> 存儲(chǔ)過(guò)程或者存儲(chǔ)函數(shù)蜒蕾,只能創(chuàng)建或者替換。
2> 參數(shù)可以帶也可以不帶焕阿。
3> as相當(dāng)于PLSQL語(yǔ)句中的declare咪啡,用來(lái)聲明變量、游標(biāo)等暮屡,但是不可以省略撤摸。

2. 入門案例:
(1)不帶參數(shù)的存儲(chǔ)過(guò)程:不用帶括號(hào)
create or replace procedure sayHello
as
begin
   dbms_output.put_line('HelloWorld');
end;
/

調(diào)用方式:

  • <1> 使用execute:
    exec是sqlplus命令,只能在sqlplus中使用栽惶,使用時(shí)愁溜,exec可以直接跟過(guò)程名(可以省略括號(hào));
    控制臺(tái)執(zhí)行示例:
SQL> set serveroutput on;
SQL> exec sayHello;
  • <2> 使用call:
    使用call時(shí)外厂,要帶上括號(hào);call為SQL命令使用時(shí),對(duì)場(chǎng)景沒(méi)有限制代承。
    控制臺(tái)執(zhí)行示例:
SQL> set serveroutput on;
SQL> call sayHello();
  • <3> 使用PLSQL語(yǔ)句調(diào)用:
    控制臺(tái)執(zhí)行示例:
SQL> set serveroutput on;
SQL> begin
         sayHello;
    end;
/
(2)帶參數(shù)的存儲(chǔ)過(guò)程:
  • 給指定的員工漲100元工資,并且打印漲前和漲后的薪水:
create or replace procedure addSal(pempno in emp.empno%type)
as
    pename emp.ename%type;
    beforesal emp.sal%type;
    aftersal emp.sal%type;
begin
    select ename,sal into pename,beforesal from emp where empno=pempno;
    aftersal:=beforesal+100;
    update emp set sal=aftersal where empno=pempno; 
    dbms_output.put_line('姓名: '||pename||' 漲前工資:'||beforesal||'漲后工資:'||aftersal);
end;
/
執(zhí)行代碼截圖

** 注意事項(xiàng):**

  • <1> 要說(shuō)明汁蝶,參數(shù)是輸入?yún)?shù)(in)還是輸出參數(shù)(out);
  • <2> 為保證調(diào)用多個(gè)存儲(chǔ)過(guò)程中處在同一個(gè)事務(wù)中论悴,所以一般不在存儲(chǔ)過(guò)程或者存儲(chǔ)函數(shù)中掖棉,commit或rollback;
3. 調(diào)試存儲(chǔ)過(guò)程:
SQL Developer 調(diào)試存儲(chǔ)過(guò)程

** 注意事項(xiàng):**
(1) oracle數(shù)據(jù)庫(kù)和PLSQL工具都是放在同一個(gè)機(jī)器上膀估;
(2) 在開(kāi)啟調(diào)試時(shí)幔亥,可能會(huì)報(bào)出權(quán)限不夠的錯(cuò)誤信息,通過(guò)下面方式進(jìn)行授權(quán):

授權(quán)
三. 存儲(chǔ)函數(shù)
1. 存儲(chǔ)函數(shù):
  • 函數(shù)(Function)為一命名的存儲(chǔ)程序,可帶參數(shù),并返回一計(jì)算值.
  • 函數(shù)和過(guò)程的結(jié)構(gòu)類似,但必須有一個(gè)return子句,用于返回函數(shù)值.
2. 創(chuàng)建存儲(chǔ)函數(shù)的語(yǔ)法:
create [or replace] function 函數(shù)名(參數(shù)列表)
return 函數(shù)值類型
as
PLSQL子程序體;
  • 注意事項(xiàng):
  • (1) 與存儲(chǔ)過(guò)程注意事項(xiàng)類似,不同的是,必須有個(gè)返回值;
  • (2) 參數(shù)列表可以有,也可以沒(méi)有.當(dāng)沒(méi)有時(shí),函數(shù)名后面不要帶括號(hào).
create or replace function queryempannal(pempno in number)
return number
as
  psal emp.sal%type;
  pcomm emp.comm%type;
begin
  select sal,comm into psal,pcomm from emp where empno=pempno;
  return psal*12+nvl(pcomm,0);
end;
四. in和out參數(shù)
1.概述
  • (1) 一般來(lái)講,存儲(chǔ)過(guò)程和存儲(chǔ)函數(shù)的區(qū)別在于存儲(chǔ)函數(shù)可以有一個(gè)返回值;而存儲(chǔ)過(guò)程沒(méi)有返回值.

  • (2) 過(guò)程和函數(shù)都可以通過(guò)out指定一個(gè)或多個(gè)輸出參數(shù).我們可以利用out參數(shù),在過(guò)程和函數(shù)中實(shí)現(xiàn)返回多個(gè)值.

    • a. 存儲(chǔ)過(guò)程和存儲(chǔ)函數(shù)都可以有out參數(shù);
    • b. 存儲(chǔ)過(guò)程和存儲(chǔ)函數(shù)都可以有多個(gè)out參數(shù);
    • c. 存儲(chǔ)過(guò)程可以通過(guò)out參數(shù)來(lái)實(shí)現(xiàn)返回值;
  • (3) 什么時(shí)候用存儲(chǔ)過(guò)程/存儲(chǔ)函數(shù)?

    • 原則:如果只有一個(gè)返回值,用存儲(chǔ)函數(shù);否則,就用存儲(chǔ)過(guò)程.
create or replace procedure queryempinform(eno in number,
                                           pename out varchar2,
                                           psal out number,
                                           pjob out varchar2 )
as
begin
  select ename,sal,job into pename,psal,pjob from emp where empno=eno;
end;
/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市察纯,隨后出現(xiàn)的幾起案子帕棉,更是在濱河造成了極大的恐慌针肥,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件香伴,死亡現(xiàn)場(chǎng)離奇詭異慰枕,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)即纲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門具帮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人低斋,你說(shuō)我怎么就攤上這事蜂厅。” “怎么了膊畴?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵掘猿,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我巴比,道長(zhǎng)术奖,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任轻绞,我火速辦了婚禮采记,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘政勃。我一直安慰自己唧龄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布奸远。 她就那樣靜靜地躺著既棺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪懒叛。 梳的紋絲不亂的頭發(fā)上丸冕,一...
    開(kāi)封第一講書(shū)人閱讀 52,475評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音薛窥,去河邊找鬼胖烛。 笑死,一個(gè)胖子當(dāng)著我的面吹牛诅迷,可吹牛的內(nèi)容都是我干的佩番。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼罢杉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼趟畏!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起滩租,我...
    開(kāi)封第一講書(shū)人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤赋秀,失蹤者是張志新(化名)和其女友劉穎利朵,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體沃琅,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡哗咆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了益眉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晌柬。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖郭脂,靈堂內(nèi)的尸體忽然破棺而出年碘,到底是詐尸還是另有隱情,我是刑警寧澤展鸡,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布屿衅,位于F島的核電站,受9級(jí)特大地震影響莹弊,放射性物質(zhì)發(fā)生泄漏涤久。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一忍弛、第九天 我趴在偏房一處隱蔽的房頂上張望响迂。 院中可真熱鬧,春花似錦细疚、人聲如沸蔗彤。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)然遏。三九已至,卻和暖如春吧彪,著一層夾襖步出監(jiān)牢的瞬間待侵,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工姨裸, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留诫给,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓啦扬,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親凫碌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子扑毡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容