如何使用游标根据另一列更新某些列?
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
我有一个名为 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