Procedura pobierająca dane z tabeli i uzupełniająca jedną z kolumn "w locie"

0

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.

1
SELECT t.id, t.id * 3 'v1'
    FROM test t;

?

0

@woolfik: to był tylko przykład :) (dodałem info w poście, żeby była jasność)
W rzeczywistości chodzi o pobieranie danych z kilku innych tabel i odpowiednie łączenie tych danych.

2
SELECT t.id, t.id * (select mnoznik from inna_tabel where cos_tam = costam) 'v1'
    FROM test t;

? :)

1

Jeśli potrzebujesz POBRAĆ dane z bazy, to używasz do tego celu polecenia SELECT. Procedury służą do przekształcania danych, dodawania nowych, usuwania lub modyfikacji starych, etc.
Masz do dyspozycji całą gamę poleceń, którymi możesz się posługiwać i możesz nimi działać cuda na kiju. A jeśli przychodzi moment, kiedy musisz użyć do pobierania danych procedury, kursora (kursory to ZUO), albo tabeli tymczasowej, to... prawie zawsze jesteś w błędzie :)
Nie napisałeś, jaki naprawdę masz problem, ale coś mi się wydaje, że jego rozwiązaniem jest słowo "JOIN"

0

Panowie nie chodzi o zupełnie inne rozwiązanie (JOIN, czy podzapytania nie mają tu zastosowania).

Chodzi o to czy można czymś zastąpić rozwiązanie z uzupełnianiem danych w tabeli tymczasowej.

W MSSQL użyłbym zmiennej typu table i ją "obrobił" w kursorze.
W PostgreSQL mógłbym stworzyć procedurę zwracającą tabelę, a wiersze uzupełniając w pętli używając return next

A w MySQL coś oprócz tabeli tymczasowej wchodzi w grę?

3

@hipekk: Z tego, co widze to nie. Ale poza tym, że nie wiem, czy czasem nie strzelasz z armaty do wróbla to rozwiązanie z tabelą tymczasową wydaje się całkiem ok. A może zrobić prostego selecta i zwrócić a jakiś przeliczania zrobić na froncie?

3

Jest inne rozwiązanie, niż tabelka tymczasowa. Stokroć lepsze. Zwykły select. Nie bardzo czuję (i wychodzi, że nie tylko ja) problem, z którym przychodzisz. Podałeś prosty przykład, teraz piszesz, że problem jest bardziej skomplikowany. Sęk w tym, że jeśli chcesz jedynie zwracać dane, to nie znajdziesz lepszego rozwiązania, niż Select.

0

@hipekk: podałeś prosty przykład to masz i proste rozwiązanie. Tabele tymczasowa stosuje tylko w 2 sytuacjach. 1 gdy specyfika problemu uniemożliwia zrobienie tego na select. 2. Gdy funkcje dostępne w select są mniej wydajne niż tabela tymczasowa (zdarza się czasami ze funkcje agregacyjne lub okienkowe sa mniej wydajne).

1 użytkowników online, w tym zalogowanych: 0, gości: 1