溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

簡單點,學(xué)習(xí)的方式簡單點~(函數(shù)存儲過程)

發(fā)布時間:2020-07-10 10:25:59 來源:網(wǎng)絡(luò) 閱讀:2315 作者:長路慢 欄目:關(guān)系型數(shù)據(jù)庫

一個很熟悉的詞語函數(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í)分享,希望對大家有些幫助。

向AI問一下細(xì)節(jié)

免責(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)容。

AI