Oracle包和包体以及与非包体定义函数、过程的区别
生活随笔
收集整理的這篇文章主要介紹了
Oracle包和包体以及与非包体定义函数、过程的区别
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.Oracle中的包和包體
Oracle中的包和包體與java中的接口和類才關系特別類似,我們就根據對比學習一下包和包體吧!
2.oracle包和包體與自定義函數,過程區別
- 2.1 如果直接create 函數,函數不會出現在包里,而是在function目錄下面,如果在包里創建,則會出現在包里,他們兩者有什么區別?
答:
1)直接創建的函數,是數據公共函數。在調用函數的時候直接調用函數名帶上參數就可以。2)而建在包體里的函數是私有函數,在有在包體里才能直接用函數名帶參數調用。 外部程序要調用需要--包名.函數名(參數)--這樣去調用。3.創建Oracle包以及實現包
sql語句如下:
-- 包(pakage)和包體(package body) -- 首先創建一個包含字段comm的emp表,再創建下面的包和包體create or replace package test_package is-- 聲明全局變量:默認獎金數額g_comm number:=100;-- 聲明存儲過程:用于重置獎金數額procedure proc_reset_comm(p_comm in number);-- 聲明函數:用于求所有員工中最高工資function func_maxsal_emp return number; end test_package; /create or replace package body test_package is -- 實現存儲過程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;-- 實現函數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;測試是否可以在包體里創建自定義函數
-- 一個已經創建好的自定義函數 -- 編寫將字符串倒敘排列的函數:比如輸入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); --處理后的結果 begin-- 計算字符串長度select length(str) into v_length from dual;-- 使用循環倒敘字符串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;--------------------------------------------------------------------------- 現在將自定義函數合并到上面的創建的包和包體中-- 包(pakage)和包體(package body) create or replace package test_package is-- 聲明全局變量:默認獎金數額g_comm number:=100;-- 聲明存儲過程:用于重置獎金數額procedure proc_reset_comm(p_comm in number);-- 聲明函數:用于求所有員工中最高工資function func_maxsal_emp return number; end test_package; /create or replace package body test_package is -- 1.實現存儲過程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.實現函數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;------------------------------------------------------- 包中沒有的,自定義函數 此處使用create function就直接報錯,故刪除createfunction func_reverse_abc(str varchar2) return varchar2isv_length number(4); --字符串的長度v_temp varchar2(1); --截取的單個字符v_result varchar2(1000); --處理后的結果begin-- 計算字符串長度select length(str) into v_length from dual;-- 使用循環倒敘字符串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; /------------------------------------------------------------------------- -- 結果說明:在編譯運行包和包體時,沒有報任何錯誤 -- 但是在測試自定方法是報錯,無法調用這個自定義方法 -- 結論:不能在包體中自定義包中不存在的函數和過程-- 測試包和包體 exec test_package.proc_reset_comm(111); select test_package.func_maxsal_emp() from dual; -- 自定義函數測試(前綴加包名,也測試不成功) select func_reverse_abc('abc') from dual;總結
以上是生活随笔為你收集整理的Oracle包和包体以及与非包体定义函数、过程的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle创建外键约束的两种方式
- 下一篇: Oracle隐式游标和显式游标