整改了一番腳本,遇到了一些兩種數據庫之間的差異,記錄一下:
觸發器:
| 差異 | MYSQL | ORACLE | 說明 |
| 創建語句不同 | create trigger `AA` BEFORE INSERT on `BB` for each row |
create or replace trigger AA before insert or update or delete on BB for each row |
1.Oracle可以在一個觸發器觸發insert,delete,update事件. Mysql每個觸發器只支持一個事件. 也就是說,目前每個trigger需要拆分成3個mysql trigger. |
| 引用新舊數據不同 | 取得新數據: NEW.aa 取得老數據: OLD.bb |
取得新數據: :new.aa 取得老數據: :old.bb |
1.oracle 多一對冒號 |
存儲過程:
| 差異 | MYSQL | ORACLE | 說明 |
| 創建語句不同 | DROP PROCEDURE IF EXISTS `SD_USER_P_ADD_USR`; create procedure AA( aa varchar(100)) |
create or replace procedure AA( varchar aa) is |
1.oracle創建語比較簡潔,mysql要先執行drop 2.mysql先變量再類型,oracle相反,且不必限定長度 3.如果是number或varchar2的話不需要定義長度。否則編譯不能通過 |
| 異常處理不一樣 | DECLARE EXIT HANDLER FOR AAEXCEPTION BEGIN ... END; |
EXCEPTION WHEN OTHERS THEN ROLLBACK ; .... |
1.mysql不能自定義異常,且使用內部異常時需要先定義 |
| 調用存儲方式不同 | call procedure(); | procedure(); | 1.調用方式不同 |
由於oracle刪除觸發器前沒有判斷是否存在,那么如何任性刪除觸發器呢:
declare
V_NUM number;
BEGIN
select count(0) into V_NUM from user_triggers where trigger_name = 'AA'; (注意大小寫)
if V_NUM > 0 then
execute immediate 'DROP TRIGGER AA';
end if;
END;
