diff --git "a/data/3.MySQL\351\253\230\351\230\266/4. \350\277\207\347\250\213\345\214\226\347\274\226\347\250\213/5. \346\270\270\346\240\207/config.json" "b/data/3.MySQL\351\253\230\351\230\266/4. \350\277\207\347\250\213\345\214\226\347\274\226\347\250\213/5. \346\270\270\346\240\207/config.json" index 4856e566837de5af3a667f68e0f826d80e1d9a00..45c6c64a8adae5235c6958257552e2cd81649576 100644 --- "a/data/3.MySQL\351\253\230\351\230\266/4. \350\277\207\347\250\213\345\214\226\347\274\226\347\250\213/5. \346\270\270\346\240\207/config.json" +++ "b/data/3.MySQL\351\253\230\351\230\266/4. \350\277\207\347\250\213\345\214\226\347\274\226\347\250\213/5. \346\270\270\346\240\207/config.json" @@ -1,8 +1,13 @@ { "node_id": "mysql-459fd14ff096438d9b6460270bec4754", - "keywords": ["cursor"], + "keywords": [ + "cursor", + "游标" + ], "children": [], - "export": [], + "export": [ + "cursor.json" + ], "keywords_must": [], "keywords_forbid": [], "group": 0 diff --git "a/data/3.MySQL\351\253\230\351\230\266/4. \350\277\207\347\250\213\345\214\226\347\274\226\347\250\213/5. \346\270\270\346\240\207/cursor.json" "b/data/3.MySQL\351\253\230\351\230\266/4. \350\277\207\347\250\213\345\214\226\347\274\226\347\250\213/5. \346\270\270\346\240\207/cursor.json" new file mode 100644 index 0000000000000000000000000000000000000000..b43507cce0a7adc519a2a0a184a980a29cbcf548 --- /dev/null +++ "b/data/3.MySQL\351\253\230\351\230\266/4. \350\277\207\347\250\213\345\214\226\347\274\226\347\250\213/5. \346\270\270\346\240\207/cursor.json" @@ -0,0 +1,7 @@ +{ + "type": "code_options", + "author": "ccat", + "source": "cursor.md", + "notebook_enable": false, + "exercise_id": "106eadb83e2c4928b503d89dda2dd8f3" +} \ No newline at end of file diff --git "a/data/3.MySQL\351\253\230\351\230\266/4. \350\277\207\347\250\213\345\214\226\347\274\226\347\250\213/5. \346\270\270\346\240\207/cursor.md" "b/data/3.MySQL\351\253\230\351\230\266/4. \350\277\207\347\250\213\345\214\226\347\274\226\347\250\213/5. \346\270\270\346\240\207/cursor.md" new file mode 100644 index 0000000000000000000000000000000000000000..1b8b7b2461697ceb8a57676b56a2b4e5a5d44dad --- /dev/null +++ "b/data/3.MySQL\351\253\230\351\230\266/4. \350\277\207\347\250\213\345\214\226\347\274\226\347\250\213/5. \346\270\270\346\240\207/cursor.md" @@ -0,0 +1,159 @@ +# 游标 + +Joe 需要开发一个存储过程 make_trade,从 orders 表 + +```mysql +create table orders ( + id int primary key auto_increment, + price decimal(12, 4), + item_id int, + amount int +) +``` + +中,按 id 从小到大加载订单数据,生成交易单,写入 trade 表 + +```mysql +create table trade ( + id int primary key auto_increment, + total decimal(12, 4) + -- ... +) +``` + +其中 trade 的 total字段保存了交易单的总金额,这个金额是每一张交易单的所有 orders 的 price 总和,其数值不会超过 20000。 + +因为撮合交易的逻辑是串行的,Joe决定用游标实现这部分逻辑。下列哪一个选项是对的(选项中仅包含撮合逻辑,不包括完整的存储过程)? + +为简单起见,我们忽略交易的详细逻辑,假设 orders 表仅包含 id, price, item_id, amount 四项。 + +## 答案 + +```mysql +create procedure make_trade() +begin + DECLARE done INT DEFAULT FALSE; + declare cur_orders cursor for select id, price, item_id, amount from orders order by id limit 1000; + declare order_id, item_id, amount INT; + declare price decimal(12, 4); + DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; + + open cur_orders; + trade: LOOP + fetch cur_orders into order_id, price, item_id, amount; + if done then + LEAVE trade; + end if; + if @total + @price > 2000 then + leave trade; + else + -- 省略交易逻辑 + end if; + END LOOP trade; + CLOSE cur_orders; + start transaction; + -- save trade + delete from orders where id < order_id; + commit ; + +end; +``` + +## 选项 + +### A + +```mysql +create procedure make_trade() +begin + DECLARE done INT DEFAULT FALSE; + declare cur_orders cursor for select id, price, item_id, amount from orders order by id limit 1000; + declare order_id, item_id, amount INT; + declare price decimal(12, 4); + DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; + + open cur_orders; + trade: LOOP + fetch cur_orders into order_id, price, item_id, amount; + if done then + LEAVE trade; + end if; + -- 省略交易逻辑 + if @total + @price > 2000 then + leave trade; + else + NEXT cur_orders; + end if; + END LOOP trade; +end; +``` + +### B + +```mysql +create procedure make_trade() +begin + declare cur_orders cursor for select id, price, item_id, amount from orders order by id limit 1000; + declare order_id, item_id, amount INT; + declare price decimal(12, 4); + DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; + + trade: LOOP + fetch cur_orders into order_id, price, item_id, amount; + -- 省略交易逻辑 + END LOOP trade; + start transaction; + -- save trade + delete from orders where id < order_id; + commit ; +end; +``` + +### C + +```mysql +create procedure make_trade() +begin + DECLARE done INT DEFAULT FALSE; + declare cur_orders cursor for select id, price, item_id, amount from orders order by id limit 1000; + declare order_id, item_id, amount INT; + declare price decimal(12, 4); + DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; + + open cur_orders; + fetch cur_orders into order_id, price, item_id, amount; + if done then + LEAVE cur_orders; + end if; + -- 省略交易逻辑 + +end; +``` + +### D + +```mysql +create procedure make_trade() +begin + DECLARE done INT DEFAULT FALSE; + declare cur_orders cursor for select id, price, item_id, amount from orders order by id limit 1000; + declare order_id, item_id, amount INT; + declare price decimal(12, 4); + DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; + + open cur_orders; + trade: LOOP + fetch cur_orders into order_id, price, item_id, amount; + if done then + LEAVE trade; + end if; + -- 省略交易逻辑 + + END LOOP trade; + CLOSE cur_orders; + start transaction; + -- save trade + delete from orders where id < order_id; + commit ; +end; +``` \ No newline at end of file diff --git a/data/tree.json b/data/tree.json index 93fbeea5b1b0b294a65f58dd10eb694bb5e2a4f0..ea21e5d8212401b29b88454809972df6be07be7f 100644 --- a/data/tree.json +++ b/data/tree.json @@ -2180,7 +2180,10 @@ { "REPEAT": { "node_id": "mysql-923c7bbf96cf4630a5dfb36f15e62d24", - "keywords": [], + "keywords": [ + "repeat", + "循环" + ], "children": [], "keywords_must": [], "keywords_forbid": [], @@ -2203,7 +2206,8 @@ " 游标": { "node_id": "mysql-459fd14ff096438d9b6460270bec4754", "keywords": [ - "cursor" + "cursor", + "游标" ], "children": [], "keywords_must": [],