游标与触发器

本文详细探讨了数据库中的游标和触发器。首先介绍了如何创建、打开和使用游标,这对于处理数据库中的单条记录或逐条执行操作至关重要。接着,讨论了触发器的使用,它允许在特定数据库事件(如插入、更新或删除)发生时自动执行代码,增强了数据库的自动化能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

游标与触发器

游标

MySQL检索操作返回一组称为结果集的行,这组返回的行都是与SQL语句相匹配的行,使用简单的SQL语句没有办法的到相应的行数据,也不能逐行的成批处理所有行。
游标是一个存储在MySQL服务器上的数据库查询,它不是一条SQL语句,而是被该语句检索出来的结果集,在存储了游标之后,应用程序可以根据需要滚动或浏览其中的数据。

创建游标

DECLARE命名游标,并定义相应的SELECT语句
e.g.
CREATE PROCEDURE processorders()
BEGIN
    -- Declare the cursor
    DECLARE ordernumbers CURSOR
    FOR
    SELECT order_num FROM orders;

    -- Open the cursor
    OPEN ordernumbers;

    -- Close the cursor
    CLOSE ordernumbers;

END;
这就是一个简单的游标示例

打开和关闭游标

OPEN ordernumbers;
CLOSE ordernumbers;

使用游标

游标被打开后,可以使用FETCH语句来访问它的每一行,FETCH制定检索什么数据,检索出来的数据存储在什么地方。
CREATE PROCEDURE processorders()
BEGIN
    -- Declare loacl variables
    DECLARE done BOOLEAN DEFAULT 0;
    DECLARE o INT;
    DECLARE t DECIMAL(8,2);

    -- Declare the cursor
    DECLARE ordernumbers CURSOR
    FOR
    SELECT order_num FROM orders;
    
    -- Declare continue handler
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;

    -- Create a table to store the results
    CREATE TALBE IF NOT EXISTS ordertotals
        (order_num INT, total DECIMAL(8,2));
    
    -- Open the cursor
    OPEN ordernumbers;

    -- Loop through all rows
    REPEAT
        -- Get order number
        FETCH ordernumbers INTO o;

        -- Get the total for this order
        CALL ordertotal(o, 1, t);

        -- Insert order and total into ordertotals
        INSERT INTO ordertotals(order_num, total)
        VALUES(o, t);

    -- End of loop
    UNTIL done END REPEAT;

    -- Close the cursor
    CLOSE ordernumbers;

END;
这个例子中,增加了一个名为t的变量存储每个订单的合计,此存储过程还在运行中创建了一个新表,名为ordertotals.这个表将保存存过程生成的结果,FETCH取每一个order_num,然后用CALL执行另一个存储过程来计算每个订单的带税合计,最后用insert保存每个订单的订单号和合计

触发器

MySQL语句在需要时被执行,存储过程也是如此,但是,如果想要某条语句在事件发生时自动执行,这时候就需要用到触发器了

触发器是MySQL响应以下任意语句而自动执行的MySQL语句,或位于BEGIN和END语句之间的一组语句
DELETE
INSERT
UPDATE
其他MySQL语句不支持触发器

只有表才支持触发器,视图和临时表不支持,每个表最多支持6个触发器(每条INSERT、UPDATE、DELETE的之前和之后)

使用触发器

创建触发器
CREATE TRIGGER newproduct AFTER INSERT ON products
FOR EACH ROW SELECT 'Product added';

删除触发器
DROP TRIGGER newproduct
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值