日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL存储过程总结(二)

發布時間:2025/6/17 数据库 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL存储过程总结(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 存儲過程例子:

DELIMITER $$ DROP PROCEDURE IF EXISTS HelloWorld$$ CREATE PROCEDURE HelloWorld() BEGIN SELECT "Hello World!"; END$$ DELIMITER ;

2. 變量聲明

?使用DECLARE來聲明,DEFAULT賦默認值,SET賦值?

DECLARE counter INT DEFAULT 0; SET counter = counter+1;

3. 參數

IN為默認類型,值必須在調用時指定,值不能返回(值傳遞)

out值可以返回(指針傳遞)

INOUT值必須在調用時指定,值可以返回

CREATE PROCEDURE test(a INT, OUT b FLOAT, INOUT c INT)

4. 條件判斷

IF THENELSEIFELSEEND IF?

DELIMITER $$ DROP PROCEDURE IF EXISTS discounted_price$$ CREATE PROCEDURE discunted_price(normal_price NUMERIC(8, 2), OUT discount_price NUMERIC(8, 2)) BEGIN IF (normal_price > 500) THEN SET discount_price = normal_price * .8; ELSEIF (normal_price > 100) THEN SET discount_price = normal_price * .9; ELSE SET discount_price = normal_price; END IF; END$$ DELIMITER ;

5. 循環?

DELIMITER $$ DROP PROCEDURE IF EXISTS simple_loop$$ CREATE PROCEDURE simple_loop(OUT counter INT) BEGIN SET counter = 0; my_simple_loop: LOOP SET counter = counter+1; IF counter = 10 THEN LEAVE my_simple_loop; END IF; END LOOP my_simple_loop; END$$ DELIMITER ;

6. WHILE DO、END WHILE?

DELIMITER $$ DROP PROCEDURE IF EXISTS simple_while$$ CREATE PROCEDURE simple_while(OUT counter INT) BEGIN SET counter = 0; WHILE counter != 10 DO SET counter = counter+1; END WHILE; END$$ DELIMITER ;

7. REPEAT、UNTILL?

DELIMITER $$ DROP PROCEDURE IF EXISTS simple_repeat$$ CREATE PROCEDURE simple_repeat(OUT counter INT) BEGIN SET counter = 0; REPEAT SET counter = counter+1; UNTIL counter = 10 END REPEAT; END$$ DELIMITER ;

8. 異常處理?
如果用cursor獲取SELECT語句返回的所有結果集時應該定義NOT FOUND error handler來防止存儲程序提前終結?
如果SQL語句可能返回constraint violation等錯誤時應該創建一個handler來防止程序終結?

9. 數據庫交互?
INTO用于存儲單行記錄的查詢結果?

DECLARE total_sales NUMERIC(8, 2); SELECT SUM(sale_value) INTO total_sales FROM sales WHERE customer_id=in_customer_id;

10. CURSOR用于處理多行記錄的查詢結果?

DELIMITER $$ DROP PROCEDURE IF EXITS cursor_example$$ CREATE PROCEDURE cursor_example() READS SQL DATA BEGIN DECLARE l_employee_id INT; DECLARE l_salary NUMERIC(8,2); DECLARE l_department_id INT; DECLARE done INT DEFAULT 0; DECLARE cur1 CURSOR FOR SELECT employee_id, salary, department_id FROM employees; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1; OPEN cur1; emp_loop: LOOP FETCH cur1 INTO l_employee_id, l_salary, l_department_id; IF done=1 THEN LEAVE emp_loop; END IF; END LOOP emp_loop; CLOSE cur1; END$$ DELIMITER ;

11. unbounded SELECT語句用于存儲過程返回結果集?

DELIMITER $$ DROP PROCEDURE IF EXISTS sp_emps_in_dept$$ CREATE PROCEDURE sp_emps_in_dept(in_employee_id INT) BEGIN SELECT employee_id, surname, firstname, address1, address2, zipcode, date_of_birth FROM employees WHERE department_id=in_employee_id; END$$ DELIMITER ;

12. UPDATE、INSERT、DELETE、CREATE TABLE非查詢語句也可以嵌入存儲過程里?

DELIMITER $$ DROP PROCEDURE IF EXITS sp_update_salary$$ CREATE PROCEDURE sp_update_salary(in_employee_id INT, in_new_salary NUMERIC(8,2)) BEGIN IF in_new_salary < 5000 OR in_new_salary > 500000 THEN SELECT "Illegal salary: salary must be between $5000 and $500, 000"; ELSE UPDATE employees SET salary=in_new_salary WHERE employee_id=in_employee_id; END IF: END$$ DELIMITER ;

13. 使用CALL調用存儲程序

DELIMITER $$ DROP PROCEDURE IF EXISTS call_example$$ CREATE PROCEDURE call_example(employee_id INT, employee_type VARCHAR(20)) NO SQL BEGIN DECLARE l_bonus_amount NUMERIC(8,2); IF employee_type='MANAGER' THEN CALL calc_manager_bonus(employee_id, l_bonus_amount); ELSE CALL calc_minion_bonus(employee_id, l_bonus_amount); END IF; CALL grant_bonus(employee_id, l_bonus_amount); END$$ DELIMITER ;

14. 一個復雜的例子?

CREATE PROCEDURE putting_it_all_together(in_department_id INT) MODIFIES SQL DATA BEGIN DECLARE l_employee_id INT; DECLARE l_salary NUMERIC(8,2); DECLARE l_department_id INT; DECLARE l_new_salary NUMERIC(8,2); DECLARE done INT DEFAULT 0; DECLARE cur1 CURSOR FOR SELECT employee_id, salary, department_id FROM employees WHERE department_id=in_department_id; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1; CREATE TEMPORARY TABLE IF NOT EXISTS emp_raises (employee_id INT, department_id INT, new_salary NUMERIC(8,2)); OPEN cur1; emp_loop: LOOP FETCH cur1 INTO l_employee_id, l_salary, l_department_id; IF done=1 THEN /* No more rows */ LEAVE emp_loop; END IF; CALL new_salary(1_employee_id, l_new_salary); /* Get new salary */ IF (l_new_salary <> l_salary) THEN /* Salary changed */ UPDATE employees SET salary=l_new_salary WHERE employee_id=l_employee_id; /* Keep track of changed salaries */ INSERT INTO emp_raises(employee_id, department_id, new_salary) VALUES (l_employee_id, l_department_id, l_new_salary); END IF: END LOOP emp_loop; CLOSE cur1; /* Print out the changed salaries */ SELECT employee_id, department_id, new_salary from emp_raises ORDER BY employee_id; END;

15. 存儲方法?
存儲方法與存儲過程的區別?
1,存儲方法的參數列表只允許IN類型的參數,而且沒必要也不允許指定IN關鍵字?
2,存儲方法返回一個單一的值,值的類型在存儲方法的頭部定義?
3,存儲方法可以在SQL語句內部調用?
4,存儲方法不能返回結果集?

CREATE [DEFINER = { user | CURRENT_USER }] PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...] routine_body CREATE [DEFINER = { user | CURRENT_USER }] FUNCTION sp_name ([func_parameter[,...]]) RETURNS type [characteristic ...] routine_body proc_parameter: [ IN | OUT | INOUT ] param_name type func_parameter: param_name type type: Any valid MySQL data type characteristic: LANGUAGE SQL | [NOT] DETERMINISTIC | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } | SQL SECURITY { DEFINER | INVOKER } | COMMENT 'string' routine_body: Valid SQL procedure statement

各參數說明見CREATE PROCEDURE and CREATE FUNCTION Syntax?

DELIMITER $$ DROP FUNCTION IF EXISTS f_discount_price$$ CREATE FUNCTION f_discount_price (normal_price NUMERIC(8,2)) RETURNS NUMERIC(8,2) DETERMINISTIC BEGIN DECLARE discount_price NUMERIC(8,2); IF (normal_price > 500) THEN SET discount_price = normal_price * .8; ELSEIF (normal_price >100) THEN SET discount_price = normal_price * .9; ELSE SET discount_price = normal_price; END IF; RETURN(discount_price); END$$ DELIMITER ;

16. 觸發器
觸發器在INSERT、UPDATE或DELETE等DML語句修改數據庫表時觸發?
觸發器的典型應用場景是重要的業務邏輯、提高性能、監控表的修改等?
觸發器可以在DML語句執行前或后觸發?

DELIMITER $$ DROP TRIGGER sales_trigger$$ CREATE TRIGGER sales_trigger BEFORE INSERT ON sales FOR EACH ROW BEGIN IF NEW.sale_value > 500 THEN SET NEW.free_shipping = 'Y'; ELSE SET NEW.free_shipping = 'N'; END IF; IF NEW.sale_value > 1000 THEN SET NEW.discount = NEW.sale_value * .15; ELSE SET NEW.discount = 0; END IF; END$$ DELIMITER ;

轉自:http://fyb613.blog.163.com/blog/static/325460922010044417672/

轉載于:https://www.cnblogs.com/xyxy/p/3886526.html

總結

以上是生活随笔為你收集整理的MySQL存储过程总结(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产精品av一区二区 | 成人人人人人欧美片做爰 | 色骚网 | av网站在线免费观看 | 国产农村熟妇videos | 五月婷婷综 | 亚洲色在线视频 | 1769国产| wwwsss在线观看 | 日韩欧美中出 | 伊人国产视频 | 成人录像| 国产一级做a爰片久久毛片男 | 日韩欧美中文在线观看 | 青青一区二区 | 亚洲永久免费 | 免费日本黄色 | 久久精品视频18 | 亚洲理论电影在线观看 | 我要看免费毛片 | 中文字幕在线观看视频一区二区 | 日韩av高清在线播放 | 日韩激情视频一区二区 | 亚洲jizzjizz | 一区二区视频免费观看 | 成人3d动漫一区二区三区 | 网站一级片 | 欧美日韩激情 | jiz亚洲 | 鸭子av| 黄色一级视屏 | 日韩精品免费看 | 欧美亚洲色图视频 | 超碰福利在线 | 亚洲福利网 | 亚洲最大成人在线视频 | 久久久视频在线观看 | 性生交大片免费看3p | 久久三区 | 与亲女洗澡时伦了毛片 | 91人妻一区二区三区 | 象人高潮调教丨vk | 精品久久久久久久久久久久久久 | 国产视频一二三四区 | 痴汉电车在线播放 | 色图一区 | 操丝袜美女视频 | 免费色播 | 国产精华一区二区三区 | 国产成人精品一区二区三区视频 | 天堂在线播放 | 亚洲www. | 日本免费一区二区三区 | 日本一区免费视频 | 欧美精品欧美极品欧美激情 | 福利视频不卡 | 97国产在线观看 | 午夜三级影院 | 蜜桃91丨九色丨蝌蚪91桃色 | 就爱啪啪网站 | 久久93 | 制服丝袜先锋 | 青青在线观看视频 | 私人午夜影院 | 日韩伦理在线视频 | 黑人玩弄人妻一区二区三区四 | 夜夜操天天射 | 天天色天天色天天色 | 国产乱淫视频 | 青青草视频| 色婷婷久久久亚洲一区二区三区 | 国产成人综合网 | 流白浆视频| 久久久久久一区二区三区 | 日本美女一区二区三区 | 成人久草| 亚洲精品国产成人久久av盗摄 | 国产91精品看黄网站在线观看 | 人妻少妇精品无码专区久久 | 蜜乳av一区 | 在线v| caoporn国产| 成人免费av片| 韩日一区二区 | 亚洲最大网站 | 久久久久国产一区二区三区潘金莲 | 亚洲av毛片基地 | 久一精品 | 高清不卡一区二区 | 人人玩人人干 | 韩国电影大尺度在线观看 | 国产精品久久久久久久久久免费 | 蜜桃臀一区二区三区 | 深田咏美在线x99av | 成人午夜久久 | 久久666 | 亚洲欧美一区二区三区孕妇 | 人妻无码中文字幕免费视频蜜桃 | 国产欧美日韩在线观看 |