覺得很有必要把基礎的東西寫下來備忘。
語句塊定義:
decalre -- 變量聲明 var1 number(2); -- 僅聲明 var2 char(2) := '11'; -- 在聲明的同時初始化 begin -- 語句 end; -- 語句塊結束
if 語句
Sql代碼 if a = 1 or b = 2 then elsif c = 3 then else end if;
case 語句
case語句如果作爲分支控制語句,最後結束語句是end case,如果是作爲select語句裏的控制語句則只需要end。
declare num number(10) := 1; begin case when num = 0 then dbms_output.put_line( 'zero'); when num = 1 then dbms_output.put_line( 'one'); else dbms_output.put_line( 'default'); end case; case num when 0 then dbms_output.put_line( 'zero'); when 1 then dbms_output.put_line( 'one'); else dbms_output.put_line( 'default'); end case; end;
for 循環
for循環主要有兩個用處。
循環一個範圍 格式:for i in [start .. end] loop ... end loop; Sql代碼 for i in 0..9 loop dbms_output.put_line('i:' || i); end loop; for i in 0..9 loop dbms_output.put_line('i:' || i); end loop;
2、遍歷隱式遊標
隱式遊標的好處是不需要手動關閉,方便
for currow in ( select t.col1, t.col2 from tableName t where ... ) loop if currow.col1 = 0 then return; -- 中止sp,返回 end if; end loop; for currow in ( select t.col1, t.col2 from tableName t where ... ) loop if currow.col1 = 0 then return; -- 中止sp,返回 end if; end loop;
isok := 9; while isok >= 0 loop isok := isok - 1; if isok = 8 then continue; -- 與編程語言的 continue 語義一樣,跳過當前循環的剩餘語句,回到循環開始 end if; if isok = 4 then exit; -- 與編程語言的 break 語義一樣,跳出循環 end if; dbms_output.put_line('isok:' || isok); end loop; dbms_output.put_line('outside while loop .'); isok := 9; while isok >= 0 loop isok := isok - 1; if isok = 8 then continue; -- 與編程語言的 continue 語義一樣,跳過當前循環的剩餘語句,回到循環開始 end if; if isok = 4 then exit; -- 與編程語言的 break 語義一樣,跳出循環 end if; dbms_output.put_line('isok:' || isok); end loop; dbms_output.put_line('outside while loop .');
存儲過程定義
create or replace procedure sp_name ( -- 入參、出參列表, 逗號分隔。 uid in varchar2, -- 不能帶長度信息 startDate in date, -- 第二個輸入參數 defaultVar in varchar2 default "", -- 默認參數,如果不傳,要注意參數的順序 isok out number, -- 輸出參數 result out varchar2 -- 第二個輸出參數 ) as -- 變量聲明,每個聲明用分號結束。可以在聲明的同時初始化 var1 varchar2(11); var2 number(2) := 123; begin -- 字符串拼接用 || dbms_output.put_line('isok:' || 'abc'); -- 調用其他存儲過程 sub_sp_name(param1, prarm2, outParam1, outParam2); end; -- 存儲過程結束
函數定義
create or replace function func ( -- 入參、出參列表, 逗號分隔。 uid in varchar2, -- 不能帶長度信息 startDate in date, -- 第二個輸入參數 defaultVar in varchar2 default "", -- 默認參數,如果不傳,要注意參數的順序 isok out number, -- 輸出參數 result out varchar2 -- 第二個輸出參數 ) return number -- 定義返回類型 as -- 變量聲明,每個聲明用分號結束。可以在聲明的同時初始化 var1 varchar2(11); var2 number(2) := 123; begin -- 字符串拼接用 || dbms_output.put_line('isok:' || 'abc'); return ret_val; end;
存儲過程與函數異同
1、兩者定義類似,都可以帶輸入輸出參數。
2、函數有返回值,存儲過程沒有。
3、函數的調用要在select語句裏;而存儲過程不用,可以獨立調用。
遊標
隱式遊標
隱式遊標的好處是不需要手動關閉,方便
for currow in ( select t.col1, t.col2 from tableName t where ... ) loop if currow.col1 = 0 then return; -- 中止sp,返回 end if; end loop;
顯式遊標
declare isok integer; v_event_id number(10); v_isagain number(2); v_rate number(2); v_sender char(11) := '13800138000'; cursor cursorVar is select event_id, isagain, rate from call_event where sender = v_sender; -- 聲明遊標 begin open cursorVar; -- 打開遊標 loop fetch cursorVar into v_event_id, v_isagain, v_rate; -- 取值 exit when cursorVar%notfound; --當沒有記錄時退出循環 dbms_output.put_line(v_event_id || ', ' || v_isagain || ', ' || v_rate); end loop; close cursorVar; -- 關閉遊標 --遊標的屬性有:%FOUND,%NOTFOUNRD,%ISOPEN,%ROWCOUNT; --%FOUND:已檢索到記錄時,返回true --%NOTFOUNRD:檢索不到記錄時,返回true --%ISOPEN:遊標已打開時返回true --%ROWCOUNT:代表檢索的記錄數,從1開始 end;
帶參數遊標
declare isok integer; v_event_id number(10); v_isagain number(2); v_rate number(2); v_sender char(11) := '13800138000'; cursor cursorVar(p_sender varchar2) is select event_id, isagain, rate from call_event where sender = p_sender; -- 聲明遊標 begin open cursorVar(v_sender); -- 打開遊標,在括號裏傳參。 loop fetch cursorVar into v_event_id, v_isagain, v_rate; -- 取值 exit when cursorVar%notfound; --當沒有記錄時退出循環 dbms_output.put_line(v_event_id || ', ' || v_isagain || ', ' || v_rate); end loop; close cursorVar; -- 關閉遊標 end;