در مای اس کیو ال برای تعریف یک تابع از ساختار زیر استفاده میکنیم :
DELIMITER $$ CREATE DEFINER=`user_name`@`host_name`|CURRENT_USER PROCEDURE `transition_name`( IN | OUT | INOUT `parameter_name` type(bigint,int , ...) ) SQL SECURITY DEFINER| INVOKER transition_name: BEGIN #----procedure_body END
در قسمت
DEFINER=`user_name`@`host_name`|CURRENT_USER
CURRENT_USER
نکته بعدی : قسمت
SQL SECURITY DEFINER| INVOKER
برای شرح تراکنش، مثال پرداخت بانکی را شرح میدهیم:
DELIMITER $$ CREATE DEFINER=CURRENT_USER PROCEDURE `transition_pay`( #-----------input value IN `pay_value` bigint, IN `admin_id` int, #-------------result code OUT `result` bigint ) SQL SECURITY INVOKER transition_pay: BEGIN DECLARE admin_credit DOUBLE DEFAULT 0; SELECT `Credit` INTO admin_credit FROM `Admin` WHERE `Admin_id` = admin_id #----- transaction body END
اگر بخواهیم به دلیلی قبل از رسیدن به تراکنش آن را کنسل کنیم، میتوان از دستور LEAVE استفاده کرد:
مثال :
IF admin_id=0 THEN set result = -1 ; #exit procedure LEAVE transition_pay; END IF;
START TRANSACTION; INSERT INTO `PayBalance` (`Value` , `Admin_id` ) VALUES (pay_value, admin_id); UPDATE `Admin` SET `Credit`=admin_credit + pay_value WHERE `admin_id`=admin_id; COMMIT;
حال اگر بخواهیم به دلیلی داخل تراکنش آن را لغو کنیم از دستور ROLLBACK استفاده میکنیم.
مثال:
IF pay_value=0 THEN set result = -1 ; #roolback procedure ROLLBACK ; END IF;
SET autocommit = {0 | 1}
نکته آخر اینکه با استفاده ار زبان پی اچ پی هم میتوان تراکنشی را شروع و تمام کرد و بین این دو دستورات مورد نظر را نوشت و همیشه وجود پروسیجر الزامی نیست.