日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Oracle包和包体以及与非包体定义函数、过程的区别

發(fā)布時間:2025/3/20 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Oracle包和包体以及与非包体定义函数、过程的区别 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1.Oracle中的包和包體

Oracle中的包和包體與java中的接口和類才關(guān)系特別類似,我們就根據(jù)對比學(xué)習(xí)一下包和包體吧!

2.oracle包和包體與自定義函數(shù),過程區(qū)別

  • 2.1 如果直接create 函數(shù),函數(shù)不會出現(xiàn)在包里,而是在function目錄下面,如果在包里創(chuàng)建,則會出現(xiàn)在包里,他們兩者有什么區(qū)別?

答:

1)直接創(chuàng)建的函數(shù),是數(shù)據(jù)公共函數(shù)。在調(diào)用函數(shù)的時候直接調(diào)用函數(shù)名帶上參數(shù)就可以。2)而建在包體里的函數(shù)是私有函數(shù),在有在包體里才能直接用函數(shù)名帶參數(shù)調(diào)用。 外部程序要調(diào)用需要--包名.函數(shù)名(參數(shù))--這樣去調(diào)用。

3.創(chuàng)建Oracle包以及實現(xiàn)包

sql語句如下:

-- 包(pakage)和包體(package body) -- 首先創(chuàng)建一個包含字段comm的emp表,再創(chuàng)建下面的包和包體create or replace package test_package is-- 聲明全局變量:默認(rèn)獎金數(shù)額g_comm number:=100;-- 聲明存儲過程:用于重置獎金數(shù)額procedure proc_reset_comm(p_comm in number);-- 聲明函數(shù):用于求所有員工中最高工資function func_maxsal_emp return number; end test_package; /create or replace package body test_package is -- 實現(xiàn)存儲過程procedure proc_reset_comm(p_comm in number)isbeginif nvl(p_comm,0)>g_comm theng_comm:=p_comm;end if;dbms_output.put_line(g_comm);end proc_reset_comm;-- 實現(xiàn)函數(shù)function func_maxsal_emp return numberisv_maxsal emp.sal%type;beginselect max(sal) into v_maxsal from a_emp;return v_maxsal;end func_maxsal_emp; end; /-- 測試包和包體 exec test_package.proc_reset_comm(111); select test_package.func_maxsal_emp() from dual;

測試是否可以在包體里創(chuàng)建自定義函數(shù)

-- 一個已經(jīng)創(chuàng)建好的自定義函數(shù) -- 編寫將字符串倒敘排列的函數(shù):比如輸入abc 返回cba create or replace function func_reverse_abc(str varchar2) return varchar2 is v_length number(4); --字符串的長度 v_temp varchar2(1); --截取的單個字符 v_result varchar2(1000); --處理后的結(jié)果 begin-- 計算字符串長度select length(str) into v_length from dual;-- 使用循環(huán)倒敘字符串for i in reverse 1..v_length loopv_temp := substr(str,i,1);v_result:=v_result||v_temp;end loop; return v_result; end; / select func_reverse_abc('abc') from dual;--------------------------------------------------------------------------- 現(xiàn)在將自定義函數(shù)合并到上面的創(chuàng)建的包和包體中-- 包(pakage)和包體(package body) create or replace package test_package is-- 聲明全局變量:默認(rèn)獎金數(shù)額g_comm number:=100;-- 聲明存儲過程:用于重置獎金數(shù)額procedure proc_reset_comm(p_comm in number);-- 聲明函數(shù):用于求所有員工中最高工資function func_maxsal_emp return number; end test_package; /create or replace package body test_package is -- 1.實現(xiàn)存儲過程procedure proc_reset_comm(p_comm in number)isbeginif nvl(p_comm,0)>g_comm theng_comm:=p_comm;end if;dbms_output.put_line(g_comm);end proc_reset_comm;-- 2.實現(xiàn)函數(shù)function func_maxsal_emp return numberisv_maxsal emp.sal%type;beginselect max(sal) into v_maxsal from a_emp;return v_maxsal;end func_maxsal_emp;------------------------------------------------------- 包中沒有的,自定義函數(shù) 此處使用create function就直接報錯,故刪除createfunction func_reverse_abc(str varchar2) return varchar2isv_length number(4); --字符串的長度v_temp varchar2(1); --截取的單個字符v_result varchar2(1000); --處理后的結(jié)果begin-- 計算字符串長度select length(str) into v_length from dual;-- 使用循環(huán)倒敘字符串for i in reverse 1..v_length loopv_temp := substr(str,i,1);v_result:=v_result||v_temp;end loop; return v_result;end func_reverse_abc; end; /------------------------------------------------------------------------- -- 結(jié)果說明:在編譯運行包和包體時,沒有報任何錯誤 -- 但是在測試自定方法是報錯,無法調(diào)用這個自定義方法 -- 結(jié)論:不能在包體中自定義包中不存在的函數(shù)和過程-- 測試包和包體 exec test_package.proc_reset_comm(111); select test_package.func_maxsal_emp() from dual; -- 自定義函數(shù)測試(前綴加包名,也測試不成功) select func_reverse_abc('abc') from dual;

總結(jié)

以上是生活随笔為你收集整理的Oracle包和包体以及与非包体定义函数、过程的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。