Mam następującą DB na serwerze MySQL 4.1.21-standard:
BEGIN;
CREATE TABLE IF NOT EXISTS User(
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
login VARCHAR(32) NOT NULL UNIQUE,
pass VARBINARY(32),
bids INT UNSIGNED);
CREATE TABLE IF NOT EXISTS Bid(
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
kkey VARBINARY(64) NOT NULL,
friend BIGINT UNSIGNED REFERENCES User(id) ON DELETE CASCADE ON UPDATE RESTRICT,
time TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL);
COMMIT
I potrzebuję wykombinować zapytanie SQL, które:
- Dla każdej krotki z relacji Bid, która się przeterminowała (tzn Bid.time<DATE_ADD(NOW(),INTERVAL 1 DAY)):
-- Incrementuje wartość pola User.bids odpowiadającemu urzytkownikowi (czyli którego User.id=Bid.friend);
-- Następnie usuwa daną krotkę z relacji Bid
Zaczełem próbować tak:
BEGIN;
DECLARE cur CURSOR FOR SELECT friend,COUNT(*) AS cnt FROM Bid WHERE time<DATE_ADD(NOW(),INTERVAL 1 DAY) GROUP BY friend;
DECLARE f,c,i BIGINT UNSIGNED;
DECLARE done BOOL DEFAULT FALSE;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = TRUE;
OPEN cur;
myLoop:LOOP
FETCH cur INTO f,c,i;
IF done THEN
CLOSE cur;
LEAVE myLoop;
END IF;
UPDATE User SET bids=bids+c WHERE id=f AND bids NOTNULL;
DELETE FROM Bid WHERE id=i;
END LOOP;
COMMIT
...ale przedchwilą zauważyłem, że w MySQL 4.1.21 nie ma jeszcze CURSOR'ów :( [glowa]