mysql 自定義存儲過程和觸發器
--存儲過程示范
DROP PROCEDURE IF EXISTS PRO_TEST;
CREATE PROCEDURE PRO_TEST(IN NUM_IN INT,OUT NUM_OUT INT,INOUT NUM_INOUT)
BEGIN
//DO ANYTHING YOU WANT
END;
參數解釋:
in : 就是輸入參數,輸入參數是會被傳入到存儲過程作為參數使用,改變它的值將不會改變其原本值,相當於是值傳遞
out: 此為輸出參數,在存儲過程中為給其值時,哪怕之前傳入值,其值也只是NULL,相當於是在存儲過程中新建一個值並付給out參數並輸出
inout:此為輸入輸出參數,可以理解為前兩者之和,最為簡單的就是理解為按照對象傳遞
在命令行中如何調用:
SET @NM_IN=1,@NM_OUT=2,@NM_INOUT=3;
call PROC_TEST(@NM_IN,@NM_OUT,@NM_INOUT);
在java中如何調用:
想辦法得到connection,在hibernate中為getSession().connection();
使用Java.Sql.CallableStatemet call=connection().prepareStatement("call PROC_TEST(1,2,3)");
call.executeQuery()將返回ResultSet對象,call.executeUpdate()將會返回受影響的行數。
--觸發器示例
觸發器按照觸發類型可分為:INSERT,UPDATE,DELETE觸發器,
按照觸發時間可分為:BEFORE,AFTER,
按照內容新舊可分為:OLD,NEW,其中刪除操作只有OLD,新增操作只有NEW,修改操作兩者皆有
eg:沒修改user表一次,就往user_back表插入修改之前和修改之後的數據:
CREATE TRIGGER TRI_UPGRADE_USER BEFORE UPDATE ON USER FOR EACH ROW
BEGIN
INSERT INTO USER_BACK(USERNAME,USERPWD) VALUES(OLD.USERNAME,OLD.USERPWD);
INSERT INTO USER_BACK(USERNAME,USERPWD) VALUES(NEW.USERNAME,NEW.USERPWD);
END;
這樣就搞定了