Oracle 儲存過程學習筆記
阿新 • • 發佈:2019-01-26
1、儲存過程簡單例項
CREATE OR REPLACE PROCEDURE 儲存過程名稱 (引數in,引數out) AS -- 變數宣告,每個宣告用分號結束。可以在宣告的同時初始化 name varchar2(50); age number(8) default 0; --開始邏輯運算 BEGIN --業務邏輯 END
2、遊標實現方式、
--顯式實現方式(可以實現多值)
cursor cursorVar is select event_id, isagain, rate from call_event where sender = v_sender; -- 宣告遊標,select語句可以包括單引號等。 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;
--隱式遊標(可以實現查詢多值)
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(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;
3、異常處理
EXCEPTION WHEN OTHERS THEN vs_msg := 'ERROR IN xxxxxxxxxxx_p('||is_ym||'):'||SUBSTR(SQLERRM,1,500); ROLLBACK; --把當前錯誤記錄進日誌表。 INSERT INTO LOG_INFO(proc_name,error_info,op_date) VALUES('xxxxxxxxxxx_p',vs_msg,SYSDATE); COMMIT; RETURN;