如何使用游标根据另一列更新某些列?

How to use cursors to update some columns according to another column?

我有一个名为 USER 的 table。此 table 有 2 列,如 end_date、access_date。 access_date 现在是空的,但我想像这样填充它: 如果 end_date 存在:access_date = end_date + 1 年(无论如何我可以进行该操作)但我的问题是我无法构建游标我之前没有使用游标逻辑。

我需要这样的东西:

    DELIMITER $$

    CREATE PROCEDURE user_procedure ()
    BEGIN

        DECLARE v_finished INTEGER DEFAULT 0;
        DECLARE v_user varchar(100) DEFAULT "";

        -- declare cursor for user
        DEClARE user_cursor CURSOR FOR
            SELECT * FROM USER;

        -- declare NOT FOUND handler
        DECLARE CONTINUE HANDLER
            FOR NOT FOUND SET v_finished = 1;

        OPEN user_cursor;

        get_user: LOOP

            FETCH user_cursor INTO v_user;

            IF v_finished = 1 THEN
                LEAVE get_user;
            END IF;

            -- operation
            -- something like:
 set @end_date = select from cursor
update expiry... etcs

        END LOOP get_user;

        CLOSE user_cursor;

    END$$

    DELIMITER ;

    CALL user_procedure();

但问题是我不知道如何定义光标,因为正如您在示例中看到的那样:

DECLARE v_user varchar(100) DEFAULT ""; i am pretty sure it is wrong and i try to fetch it into FETCH user_cursor INTO v_user;

那么我怎样才能正确定义游标并获取整行并进行更改?

编辑:有些人不明白,说我又问了同样的问题,好吧,我将编辑真正的代码,现在根据人们的评论如下。此更新必须应用于每一行。

set @key = 'bla bla';

    delimiter $$
    create procedure select_or_insert()
    begin
        IF EXISTS (select USER_EXPIRY_DATE from USER) THEN
            update USER set ACCESS_EXPIRY_DATE = DATE_ADD(USER_EXPIRY_DATE, INTERVAL 1 YEAR);
        ELSE IF EXISTS (select USER_START_DATE from USER) THEN
            SET @start_date = (select USER_START_DATE from USER);
            SET @start_date_to_be_added = aes_decrypt(@start_date,@key)
          update USER set ACCESS_EXPIRY_DATE = DATE_ADD(USER_EXPIRY_DATE, INTERVAL 1 YEAR);
        END IF;
    end $$
    delimiter ;

但这里例如:

ELSE IF EXISTS (select USER_START_DATE from USER) is returning more than 1 row.

你不需要游标,你可以简单地使用更新语句:

UPDATE User
SET access_date = DATE_ADD(end_date, INTERVAL 1 YEAR)
WHERE end_date IS NOT NULL