[MySQL (Function)] - Tabellenname dynamisch!?

secret_3des

Lieutenant
Registriert
Sep. 2005
Beiträge
823
Hallo!

Gibt es eine Möglichkeit einer MySQL Funktion einen Tabellenname zu übergeben und diesen dann in einer Abfrage zu verwenden?

Beispiel (wie ich das gern hätte - es so aber nicht funktioniert, da "tableName" als Tabelle und nicht als Variable interpretiert wird und daher "table tableName not found" als Fehlermeldung kommt):

edit: Mir ist klar, dass der SQL-Befehl so direkt interpretiert wird, aber wie binde ich die Variable in die SQL-Anfrage ein?

Code:
delimiter //
CREATE FUNCTION test_tabelle
(attr CHAR(50), tableName CHAR(50), ..) RETURNS INT
BEGIN
DECLARE maxLvl INT;

DECLARE maxi DOUBLE;
DECLARE mini DOUBLE;

SELECT MAX(attr) INTO maxi FROM tableName;
SELECT MIN(attr) INTO mini FROM tableName;

...

RETURN maxLvl;

END;
//

Viele Grüße
Tom
 
Zuletzt bearbeitet:
sicher geht das, was fürne programmiersprache benutzt du ?
 
Hallo,

was du suchst wird hier erklärt.

Falls dein Englisch nicht nicht so gut sein sollte, kann ich dir die wichtigsten Teile nochmal auf deutsch erklären.

Gruß Tobias
 
Danke für den Tipp! Ich würde das aber, wenn es irgendwie möglich ist, gern als Funktion machen. Die Funktionen sollen in einer SQL-Query eingebaut werden und direkt "verrechnet" werden. Mit einer Stored Procedure ist das nicht möglich, oder täusche ich mich da?

Wenn ich das wie beschrieben in der "function" umsetzen will, kommt leider die Fehlermeldung "Dynamic SQL is not allowed in stored function or trigger".

Gibt es nicht auch eine Lösung wie man das in einer Funktion realisieren kann (mit dem konkatenieren)?
 
Hallo,

soviel ich weiß geht das nicht. Aber das Problem lässt sich umgehen.

Schreibe deine Prozedur so:

CREATE PROCEDURE test_tabelle
(IN attr CHAR(50), IN tableName CHAR(50), OUT maxLvl INT)

Dann kommt man an das Ergebnis per:

CALL test_tabelle('attr', 'tableName', @variable);
SELECT @variable;

Gruß Tobias
 
Ok, dann werde ich es wohl so machen (müssen)! Vielen Dank für deine Hilfe!

edit:
Es sieht jetzt so aus:
Code:
delimiter //
CREATE PROCEDURE test_tabelle
(IN attr CHAR(50), IN tableName CHAR(50), IN low DOUBLE, IN high DOUBLE, IN dVal DOUBLE, OUT maxLvl INT)

BEGIN

DECLARE maxi, mini DOUBLE;
DECLARE maxiLvl, miniLvl INT;

SET @s1 = CONCAT('SELECT MAX(' , attr , ') INTO @maxi FROM ' , tableName);
PREPARE stmt1 FROM @s1;
EXECUTE stmt1;

SET @s2 = CONCAT('SELECT MIN(' , attr , ') INTO @mini FROM ' , tableName);
PREPARE stmt2 FROM @s2;
EXECUTE stmt2;

SET maxiLvl = lvlfunc(maxi, low, up, dVal);
SET miniLvl = lvlfunc(mini, low, up, dVal);

CASE WHEN maxiLvl > miniLvl THEN SET maxLvl = maxiLvl;
ELSE SET maxLvl = miniLvl;
END CASE;

END;
//

Der Aufruf sieht so aus:
Code:
CALL psql_betweenMaxLvl('ps', 'cars', 150, 200, 50, @value);
SELECT @value;

Leider bekomme ich als Ergebnis immer NULL zurück. Hat jemand eine Idee woran das liegen kann? Die Funktion lvlfunc tut das was sie soll und liefert einen INT-Wert zurück.

Viele Grüße
Tom
 
Zuletzt bearbeitet:

Ähnliche Themen

Zurück
Oben