Oracle包和包体以及与非包体定义函数、过程的区别
生活随笔
收集整理的這篇文章主要介紹了
Oracle包和包体以及与非包体定义函数、过程的区别
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1.Oracle中的包和包體
Oracle中的包和包體與java中的接口和類才關(guān)系特別類似,我們就根據(jù)對(duì)比學(xué)習(xí)一下包和包體吧!
2.oracle包和包體與自定義函數(shù),過程區(qū)別
- 2.1 如果直接create 函數(shù),函數(shù)不會(huì)出現(xiàn)在包里,而是在function目錄下面,如果在包里創(chuàng)建,則會(huì)出現(xiàn)在包里,他們兩者有什么區(qū)別?
答:
1)直接創(chuàng)建的函數(shù),是數(shù)據(jù)公共函數(shù)。在調(diào)用函數(shù)的時(shí)候直接調(diào)用函數(shù)名帶上參數(shù)就可以。2)而建在包體里的函數(shù)是私有函數(shù),在有在包體里才能直接用函數(shù)名帶參數(shù)調(diào)用。 外部程序要調(diào)用需要--包名.函數(shù)名(參數(shù))--這樣去調(diào)用。3.創(chuàng)建Oracle包以及實(shí)現(xiàn)包
sql語句如下:
-- 包(pakage)和包體(package body) -- 首先創(chuàng)建一個(gè)包含字段comm的emp表,再創(chuàng)建下面的包和包體create or replace package test_package is-- 聲明全局變量:默認(rèn)獎(jiǎng)金數(shù)額g_comm number:=100;-- 聲明存儲(chǔ)過程:用于重置獎(jiǎng)金數(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 -- 實(shí)現(xiàn)存儲(chǔ)過程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;-- 實(shí)現(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ù)
-- 一個(gè)已經(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); --截取的單個(gè)字符 v_result varchar2(1000); --處理后的結(jié)果 begin-- 計(jì)算字符串長度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)獎(jiǎng)金數(shù)額g_comm number:=100;-- 聲明存儲(chǔ)過程:用于重置獎(jiǎng)金數(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.實(shí)現(xiàn)存儲(chǔ)過程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.實(shí)現(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就直接報(bào)錯(cuò),故刪除createfunction func_reverse_abc(str varchar2) return varchar2isv_length number(4); --字符串的長度v_temp varchar2(1); --截取的單個(gè)字符v_result varchar2(1000); --處理后的結(jié)果begin-- 計(jì)算字符串長度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é)果說明:在編譯運(yùn)行包和包體時(shí),沒有報(bào)任何錯(cuò)誤 -- 但是在測試自定方法是報(bào)錯(cuò),無法調(diào)用這個(gè)自定義方法 -- 結(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle创建外键约束的两种方式
- 下一篇: Oracle隐式游标和显式游标