您好,登錄后才能下訂單哦!
一個很熟悉的詞語函數(shù),最早接觸于函數(shù)是數(shù)學(xué)課,萬分沒想到它在以后的學(xué)習(xí)中越來越重要。編程語言都會單獨給函數(shù)開一章節(jié)來詳細(xì)介紹,可見在編程語言中的地位杠杠的!
那么函數(shù)真的很難學(xué)嗎?起碼對于編程來說(源碼除外),除了大量系統(tǒng)函數(shù)使用語法比較難記外,其實還是蠻實用和容易接受。
函數(shù)、存儲過程是什么?那么把增刪改查等放在一起,一并執(zhí)行更高效的來完成這些操作這個代碼塊(組合)稱為存儲過程或函數(shù)。
函數(shù)在Oracle中必須有返回值,這也是區(qū)分與存儲過程的區(qū)別,函數(shù)分為兩種:1、系統(tǒng)函數(shù) 2、自定義函數(shù) 本篇的文章是分享的自定義函數(shù)(系統(tǒng)在后面更新)
什么是自定義函數(shù),當(dāng)然是根據(jù)我們的需求,按章我們的意愿去實現(xiàn)一些功能比如
1、函數(shù)功能與劃分:
自定義函數(shù)明確這個函數(shù)干什么,完成什么需求而創(chuàng)建,,每個獨立功能應(yīng)該用函數(shù)單獨實現(xiàn),多個功能在同一函數(shù)去實現(xiàn),增加代碼的復(fù)雜性,而且不容易維護(hù),不易最大化實現(xiàn)復(fù)用,針對功能實現(xiàn)函數(shù)。
2、函數(shù)的參數(shù)
函數(shù)參數(shù)可以表示無參合形參,形參需要指定數(shù)據(jù)類型,當(dāng)參數(shù)傳遞到內(nèi)部的時候,參數(shù)是不可改變的。
3、返回值
函數(shù)必須具備返回值,不能返回集合參數(shù),所以,記錄與記錄集不是Oracle中類型。
格式:
create or replace function fun_one
return number as
begin
return 123;
end fun_one;
/
解釋:
create or replace function來創(chuàng)建函數(shù)的關(guān)鍵字,然后后面是根返回值數(shù)據(jù)類型,begin -- end 之間代碼是函數(shù)定義。
格式:
select object_id,object_name,object_type,status from user_objects where lower(object_name)='函數(shù)名';
select name,type,line,text from user_soucre where lower(name)='函數(shù)名';
解釋:
解釋一下,查詢的是user_objects和user_soucre兩個表,查詢函數(shù)狀態(tài)和詳細(xì)函數(shù)創(chuàng)建過程的語句,我們在創(chuàng)建時候函數(shù)名稱無論大小寫,在存儲在數(shù)據(jù)字典都會以大寫的方式存儲,lower()函數(shù)是大寫變小寫的意思,函數(shù)名可以輸入小寫來查詢。
格式:
declare msy number;
begin
msg := fun_one;--把創(chuàng)建的函數(shù)復(fù)制給msg變量
dbms_output.put_line(msg);
end;
解釋:關(guān)鍵字declaer聲明一個變量,然后基于函數(shù)賦值,輸出變量函數(shù),\可以輸出上一回的執(zhí)行結(jié)果,set serveroutput on;開啟Oracle輸出。
函數(shù)的確定性:
函數(shù)的確定性就是,每次調(diào)用函數(shù),Oracle總是會根據(jù)參數(shù)來執(zhí)行相同的步驟,輸出結(jié)果相同,無論多少次執(zhí)行結(jié)果總是相同,參數(shù)不會再函數(shù)代碼塊中變化不可變,具有確定性的函數(shù),可以用關(guān)鍵字deterministic來創(chuàng)建確定函數(shù)。
對于頻繁使用的函數(shù),使用確定性的函數(shù)很大程度上提高數(shù)據(jù)庫性能,那么函數(shù)在調(diào)用時候會查找以前是否使用過相同參數(shù)的函數(shù),如果有直接使用先前執(zhí)行的結(jié)果,而不會去執(zhí)行函數(shù)的定義過程,提高數(shù)據(jù)庫性能,節(jié)省計算機(jī)資源。
存儲過程:
存儲過程不需要返回值,不同于函數(shù),函數(shù)適用于復(fù)雜的計算來提升數(shù)據(jù)庫性能,而過程則更適合執(zhí)行數(shù)據(jù)大量的更新,查詢等操作。
過程的三類:1、IN 2、OUT 3、IN OUT
那么過程都是啥好處呢?
1、編程SQL接口更新應(yīng)用的數(shù)據(jù),可能會頻繁的連接數(shù)據(jù)庫,那么通過API接口來連接會耗費大量的資源,把工作交付過程來實現(xiàn),大大減少了數(shù)據(jù)庫的執(zhí)行效率。
2、安全:過程作為數(shù)據(jù)庫中的對象,可以存儲過程分配權(quán)限來控制整個安全性,同時存儲過程實際實現(xiàn)了數(shù)據(jù)庫從編程語言轉(zhuǎn)移到數(shù)據(jù)庫中,數(shù)據(jù)的完整性操作一直被保留。
3、那么過程存儲最初的設(shè)計理念之一也是為了可復(fù)用。
注意:不能直接實現(xiàn)數(shù)據(jù)庫定義語言,既DDL
格式:
create or replace procedurl pr_xx as begin update 表 set 列 = 10; commit; end pr_xx;
解釋:
procedure關(guān)鍵字創(chuàng)建過程.
格式:
execute 過程名稱;
-----------------------------
begin
過程名稱;
end;
/
----------------------------
解釋:
execute來實現(xiàn)調(diào)用過程,也可用通過begin函數(shù)調(diào)用方法來實現(xiàn),實際也是演示了如何從一個函數(shù)或過程中調(diào)用另一個函數(shù)或過程。
存儲過程IN:
格式:
create or replace proceduer update_xx(in_age in number) as begin
update 表 set 列 = in_age;
commit;
end update_xx;
/
解釋:
IN參數(shù),傳入?yún)?shù),只進(jìn)不出的參數(shù)。由調(diào)用者傳遞給存儲過程之后,由存儲過程執(zhí)行,無論怎樣使用參數(shù),無法改變參數(shù)的值。對于該存儲過程來說,是只讀的。如果修改IN的值將會報錯!
存儲過程OUT:
格式:
create or replace proceduer update_xxx(in_age in number,out_age out number) as begin
update 表 set 列 = in_age;
select 列 into out_age from 表 where 列 = 1;
end update_xxx;
解釋:
OUT參數(shù),顧名思義輸出,將表列=1的賦值給out_age;
格式:
declaer updated_age number;
begin
update_xxx(20,updated_age);
dbms_output.ut_line(updated_age);
end;
/
解釋:
那么看代碼,我們聲明一個新變量,調(diào)用了創(chuàng)建的OUT存儲過程,并把變量傳遞到out_age中,然后輸出,一定要為輸出指定變量名稱,不能用常亮否則將會報錯。
存儲過程的參數(shù)-IN OUT參數(shù)
IN OUT參數(shù)即可作為輸入?yún)?shù),也可以作為輸出參數(shù)。所以IN OUT一般用于對參數(shù)值的進(jìn)行處理,并處理結(jié)果輸出。
舉一個比較有意義的列子參數(shù)變量交換
格式:
create or replace proceduer swap(in_out1 in out number,in_out2 in out number) as
begin
declaer para number;
begin
para := in_out1;
in_out1 := in_out2;
in_out2 := para;
end;
end;
/
解釋:
在JAVA的冒泡排序中也會用到變量置換,那么創(chuàng)建臨時變量,來相互交換。
存儲過程雖然帶來很大的便利,同樣存儲過程也可以被多個用戶調(diào)用,針對輸出參數(shù)的變量,將被頻繁無規(guī)律的更新,控制變量將非常困難,而且不能使用常量來作為輸入?yún)?shù),否則編譯錯誤。
了解:
存儲過程的參數(shù)順序很重要--解決方案:名稱表示法(不做介紹)
存儲過程參數(shù)--參數(shù)默認(rèn)值 在創(chuàng)建存儲過程中默認(rèn)參數(shù)的列如下:
in_age in number default 20
函數(shù)存儲過程,遠(yuǎn)遠(yuǎn)不止本文章介紹那么簡單,配合條件控制等無限可能,以上是對函數(shù)和存儲過程學(xué)習(xí)分享,希望對大家有些幫助。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。