Hej.
Potrzebuję zrobić procedurę która pobierze mi dane z tabeli i dla każdego rekordu "w locie" przeliczy jedną z kolumn.
Testowo zrobiłem coś takiego:
CREATE PROCEDURE test()
BEGIN
DECLARE finished INTEGER DEFAULT 0;
DECLARE row_id INTEGER DEFAULT 0;
DECLARE cur
CURSOR FOR
SELECT id FROM return_table;
DECLARE CONTINUE HANDLER
FOR NOT FOUND SET finished = 1;
DROP TEMPORARY TABLE IF EXISTS return_table;
CREATE TEMPORARY TABLE return_table
SELECT t.id, 0 'v1'
FROM test t;
OPEN cur;
setValue:
LOOP
FETCH cur INTO row_id;
IF finished = 1 THEN
LEAVE setValue;
END IF;
UPDATE return_table
SET v1 = id * 3
WHERE id = row_id;
END LOOP setValue;
CLOSE cur;
SELECT *
FROM return_table;
END
Przykład live:
https://paiza.io/projects/apmlix_Kjm-mx21cNQPbxQ?language=mysql
Jednak średnio przekonuje mnie to rozwiązanie, z racji na zostawianie utworzonej tabeli tymczasowej. (zostanie usunięta dopiero przy zamknięciu połączenia)
Jak inaczej można podejść do tego problemu?
Ps. Oczywiście id * 3
to tylko przykład - w rzeczywistości chodzi o pobieranie i odpowiednie obrabianie danych z innych tabel.