亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

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

系統(tǒng) 2144 0

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

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

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

?

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

? ①準備表:

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

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

? ②準備知識點:

??? 如果只是計算數(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;

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

???? 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;

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

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

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

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

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

接下來我們就可以直接從外部通過方法調(diào)用來完成我們需要的業(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;

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

?

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

?

其他:

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

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

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

?

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

?

每日一問:

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

<!-- -->

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


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

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产精品视频一区麻豆 | 91在线观 | www.色av.com| 欧美肥婆videos另类 | 欧美日韩激情在线 | 在线播放五十路乱中文 | 爱爱爱久久久久久久 | 欧美国产精品日韩在线 | 自拍视频精品 | 五月天天色 | 欧美精品亚洲精品日韩一区 | 污网站视频在线观看 | 国产毛片一区二区 | 天天干干| 国产精品久久久免费视频 | 欧美激情精品久久久久久久久久 | 一区二区手机视频 | 久久亚洲国产精品一区二区 | 高清一区二区三区 | 99热成人精品热久久669 | 国产不卡在线观看 | 一级特黄性色生活片 | 精品欧美一区二区在线观看 | 爱操综合网 | 一级片在线观看免费 | 天海翼一区 在线播放 | swag国产精品一区二区 | 日本伊人色综合网站 | 香蕉亚洲精品一区二区 | 狼人香蕉香蕉在线视频播放 | 伊人国产精品 | 日本高清免费不卡视频 | 四虎影视院 | 日本黄页网站在线观看 | a级毛片免费完整视频 | 天天色综网| 福利午夜最新 | 久久福利青草免费精品 | 日欧毛片 | 一本到视频在线观看 | 欧美美女一区二区三区 |