日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

Oracle學(xué)習(xí)筆記(三)——函數(shù)與過(guò)程

系統(tǒng) 2128 0

函數(shù)與存儲(chǔ)過(guò)程是數(shù)據(jù)庫(kù)操作中很重要的一部分,為了更好的理解,我就不做太多的理論講解,下面是我為了把今天的內(nèi)容融合到一起自己設(shè)計(jì)的一個(gè)需求:

??? 用我們現(xiàn)在手上有的兩張表:emp、dept。emp表中有員工工資,獎(jiǎng)金等信息,dept表中有部門(mén)信息

??? 有時(shí)候我們會(huì)遇到這樣的業(yè)務(wù):財(cái)務(wù)部門(mén)將統(tǒng)計(jì)出來(lái)的工資分發(fā)到每個(gè)部門(mén),由各個(gè)部門(mén)自己發(fā)工資(個(gè)人虛構(gòu)的),在這個(gè)過(guò)程中我們就需要將每個(gè)部門(mén)的總工資算出來(lái),于是就有了今天的代碼:

?

準(zhǔn)備部分(復(fù)習(xí)):

? ①準(zhǔn)備表:

??? 創(chuàng)建一個(gè)存放最終數(shù)據(jù)的表:

CREATE TABLE getmoney(
????? deptno NUMBER,??????????? --部門(mén)編號(hào)
????? d_name VARCHAR2(20),??????--部門(mén)名字
????? money NUMBER,???????????? --該部門(mén)工資總額
????? isget VARCHAR(20)???????? --是否領(lǐng)取
)

? ②準(zhǔn)備知識(shí)點(diǎn):

??? 如果只是計(jì)算數(shù)據(jù)用function,如果需要修改數(shù)據(jù)用procedure

?③主體部分:

??? function部分:

CREATE OR REPLACE FUNCTION get_result(
?? p_deptno IN NUMBER
)
RETURN NUMBER
AS
??? result_money NUMBER;
BEGIN
???? result_money := 0;
???? FOR my_cursor IN (SELECT * FROM emp WHERE emp.deptno=p_deptno)
???? LOOP
??????? result_money := result_money+nvl(my_cursor.sal,0)+nvl(my_cursor.comm,0);
???? END LOOP;
???? RETURN result_money;
END;

說(shuō)明 :function必須返回一個(gè)結(jié)果,在定義部分"return 返回類(lèi)型",在塊中用"return 返回值",該值必須是前面定義的數(shù)據(jù)類(lèi)型

???? procedure部分:

CREATE OR REPLACE PROCEDURE p_add_data(
??? p_deptno NUMBER,
??? p_name VARCHAR2,
??? p_money NUMBER,
??? p_isget VARCHAR2 DEFAULT '否'
)
AS
BEGIN
???? INSERT INTO getmoney(deptno,d_name,money,isget)
??????????? VALUES(p_deptno,p_name,p_money,p_isget);
???? COMMIT;
END;

說(shuō)明 :在定義參數(shù)的時(shí)候可以使用默認(rèn)值(如p_isget VARCHAR2 DEFAULT '否'),表示如果在調(diào)用該過(guò)程時(shí)沒(méi)有傳入該參數(shù)的值,則系統(tǒng)為使用默認(rèn)值來(lái)代替,定義默認(rèn)值時(shí)必須放在最后定義.注意在procedure中沒(méi)有return,如果想對(duì)外返回一個(gè)結(jié)果可以定義參數(shù)為out或者in out,見(jiàn)下行:

不論是function還是procedure都有3種參數(shù):

????????????? 輸入?yún)?shù) in:表示該參數(shù)只能接收數(shù)據(jù),不能對(duì)外提供數(shù)據(jù)讀取

????????????? 輸出參數(shù) out:表示該參數(shù)只能被讀取,不能修改

????????????? 輸入輸出參數(shù) in out:功能結(jié)合了上面兩者,注意不能寫(xiě)為out in

接下來(lái)我們就可以直接從外部通過(guò)方法調(diào)用來(lái)完成我們需要的業(yè)務(wù)了:

DECLARE
?? money NUMBER;
BEGIN
???? money := 0;
???? FOR my_deptno IN (SELECT * FROM dept)
???? LOOP
???????? money :=? scott.get_result(my_deptno.deptno);
???????? scott.p_add_data(my_deptno.deptno,my_deptno.dname,money);
???? END LOOP;
END;

這里用到了游標(biāo)FOR循環(huán)(見(jiàn)本人前1,2篇文章所述,這里不再詳談),定義好了函數(shù)和過(guò)程后我們就可以當(dāng)系統(tǒng)函數(shù)來(lái)使用了,使用方法與使用系統(tǒng)函數(shù)一樣,傳入我們需要的參數(shù)即可,本例是自動(dòng)傳參的.

?

通過(guò)上面的例子,我們可以看到函數(shù)和過(guò)程不是我們想象中的那么復(fù)雜,所以我們應(yīng)該有足夠的理由將ORACLE學(xué)好.

?

其他:

包的創(chuàng)建和使用,如下圖:

Oracle學(xué)習(xí)筆記(三)——函數(shù)與過(guò)程

注意:包相當(dāng)于JAVA中的包+接口,我們可以看到在上部分定義包中,只定義了函數(shù)而沒(méi)有具體的實(shí)現(xiàn)部分,在body部分做具體的實(shí)現(xiàn),外部調(diào)用的時(shí)候用'包名.函數(shù)名'的方式調(diào)用

?

??ORACLE中的命名規(guī)范:
存儲(chǔ)過(guò)程:strore procedure,所以用 sp_
函數(shù):function,所以用 func_或f_
觸發(fā)器:trigger,所以用 tr_
包:package,所以用pkg_
參數(shù):parameter,所以用 p_
變量:variable,所以用 v_
表:table,t_
說(shuō)明:
每個(gè)公司都有一些自定義開(kāi)發(fā)規(guī)范。

?

每日一問(wèn):

? 常見(jiàn)問(wèn)題:
?? 面對(duì)復(fù)雜業(yè)務(wù),用其它語(yǔ)言(如JAVA)開(kāi)發(fā),還是用數(shù)據(jù)庫(kù)腳本(存儲(chǔ)過(guò)程、函數(shù)、觸發(fā)器)開(kāi)發(fā)
分析?
①如果開(kāi)發(fā)的系統(tǒng)所使用數(shù)據(jù)庫(kù)平臺(tái)有更換的可能,則其它語(yǔ)言開(kāi)發(fā)比較好,因?yàn)椴煌臄?shù)據(jù)庫(kù),腳本語(yǔ)言是完全不同的(方言)。
②通常電力,電信,移動(dòng)等數(shù)據(jù)庫(kù)平臺(tái)相對(duì)固定,業(yè)務(wù)又相當(dāng)復(fù)雜,所以數(shù)據(jù)庫(kù)腳本編程已經(jīng)在大量使用。
③說(shuō)明:在流行的J2EE的架構(gòu)中,不建議在數(shù)據(jù)庫(kù)端處理業(yè)務(wù),而是通過(guò)“OR映射” (如Hibernate)的方式處理。

<!-- -->

Oracle學(xué)習(xí)筆記(三)——函數(shù)與過(guò)程


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 庆安县| 德阳市| 常德市| 宝山区| 卢龙县| 阿拉善右旗| 河北区| 绥滨县| 徐水县| 抚顺县| 固安县| 定州市| 龙门县| 白山市| 普定县| 杨浦区| 高安市| 河北省| 仪陇县| 修水县| 嘉峪关市| 临泉县| 荣昌县| 鹤庆县| 平遥县| 霍林郭勒市| 安多县| 若羌县| 佛坪县| 凉城县| 宝丰县| 梅河口市| 高淳县| 富平县| 自治县| 清水县| 松桃| 博爱县| 舒城县| 田林县| 龙泉市|