初出茅廬,不知原來存儲過程還可以寫得如此復雜,而且還竟然可以調試!
好吧,得整理一下存儲過程的一些語法,以備以后用到時可以查閱。
使用數據庫:Oracle
數據庫工具:PL/SQL Developer
在Oracle中使用存儲過程可以聲明單個存儲過程,也可以使用包的方式一個存儲過程包(PACKAGE)包含許多存儲過程。
編寫單個存儲過程的格式可以參考下面這個例子,這是最簡單的存儲過程例子:
CREATE OR REPLACE PROCEDURE PROC_TEST IS /* 聲明變量 */ count number; BEGIN /* SQL代碼 */ select * from dual; /* 異常處理 */ EXCEPTIOIN WHEN NO_DATA_FOUND THEN --處理代碼 WHEN OTHERS THEN --處理代碼 END PROC_TEST; --這里也可以直接寫成: "END;"
如果有許多存儲過程,那么你可能需要用到存儲過程包。在Oracle中使用存儲過程包首先要先創建package聲明存儲過程,之后創建package body寫存儲過程的具體內容。
存儲過程的package相當於Java中的接口,而package body就相當於Java中實現該接口的類。
1.聲明存儲過程
CREATE OR REPLACE PACKAGE PACK_ZOO IS /* 不帶參數的存儲過程 */ PROCEDURE WATCH_MONKEY; /* 帶參數的存儲過程 */ PROCEDURE FEED_MONKEY(p_food IN VARCHAR2, p_amount IN NUMBER); END PACK_ZOO;
①在oracle的存儲過程中,形式參數(形參)聲明用IN關鍵字。上面代碼[p_food IN VARCHAR2] 中,p_food為變量名,IN為關鍵字,VARCAHR2為變量類型。
②在存儲過程中聲明參數,則是直接變量名后跟上變量類型,如下面代碼中的name參數:[name VARCAHR2(12)]。
2.編寫存儲過程內容
CREATE OR REPLACE PACKAGE BODY PACK_ZOO IS /* * 不帶參數的存儲過程 */ PROCEDURE WATCH_MONKEY IS /* 參數聲明 */ name VARCHAR2(12); BEGIN /* 處理體 */ SELECT * FROM DUAL; /* 異常處理 */ EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('無數據記錄'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('異常代碼:' + sqlcode); --sqlcode代表異常代碼 DBMS_OUTPUT.PUT_LINE('異常信息:' + sqlerrm); --sqlerrm代表異常信息 END WATCH_MONKEY; /* *帶參數的存儲過程 */ PROCEDURE FEED_MONKEY(p_food IN VARCHAR2, p_amount IN NUMBER) IS /* 參數聲明 */ name VARCHAR2(12); BEGIN /* 處理體 */ name := 'Hello Oracle!'; /* 異常處理 */ EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.put_line('CATCH EXCEPTIOIN'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('異常代碼:' + sqlcode); --sqlcode代表異常代碼 DBMS_OUTPUT.PUT_LINE('異常信息:' + sqlerrm); --sqlerrm代表異常信息 END FEED_MONKEY; END PACK_ZOO;
在方法體里要給一個變量賦值,應該使用符號 " := ",如:" name := 'Hello Oracle!' "。
這里用到的語法是PLSQL語法,想了解更多關於PLSQL語法的知識,可以看我的另一篇文章:PL/SQL基礎語法