nativemode
Goto Top

Rückgabewert von MySQL-Funktion

Hallo,
ich habe für eine mySQL-Abfrage eine eigene Funktion erstellt und abgespeichert:
DELIMITER //

CREATE FUNCTION checkInOut ( memberID INT, stationID INT, minMinutes INT, maxHours INT )
RETURNS INT

BEGIN

	DECLARE indx	INT;
	DECLARE tin	TIMESTAMP;
	DECLARE tout	TIMESTAMP;

	-- Als erstes hohlen wir uns das letzte Ereignis dieses Mitgliedes
	SELECT `index`, `in`, `out` INTO indx, tin, tout FROM `log`
		WHERE `member` = memberID
		AND `station` = stationID
		ORDER BY `index` DESC
		LIMIT 1;
	
	-- CheckIn - oder Out?
	IF tout IS NULL THEN
		-- Checkout-Ereignis
		-- Checkin weniger als 5 Minuten her?
		IF TIMESTAMPDIFF(MINUTE, tin, NOW()) < minMinutes THEN
			-- "Ereignis verwerfen" zurückgeben  
			RETURN 0;
		END IF;
		
		-- Checkin weniger als 8 Stunden her?
		IF TIMESTAMPDIFF(HOUR, tin, NOW()) < maxHours THEN
			-- Checkout speichern
			UPDATE `log` SET `out` = NOW()
				WHERE `index` = indx;
			
			-- Erfolgreichen Checkout Zurückgeben
			RETURN 2;
		END IF;
	END IF;

	-- CheckIn-Ereignis
	INSERT INTO `log` (`member`, `station`, `in`, `out`)
		VALUES (memberID, stationID, NOW(), NULL);
		
	-- Erfolgreichen Checkin zurückgeben
	RETURN 1;
	
END; //

DELIMITER ;

Soweit so gut, das funktioniert wenn ich es in phpMyAdmin ausführe. Frage: Wie führe ich es aus Python aus?
Ich versuchte es so:
	cursor = mysql.cursor()
	
	
	sql = ("SELECT checkInOut(%s, %s, 5, 8);") % (memberID, stationID)  
	
	
	try:
		cursor.execute(sql)
	except MySQLdb.Error, e:
		mysql.rollback()
		print("Fehler [%d]: %s" % (e.args, e.args[1]))  
		sys.exit(e.args)
		
		
	mysql.commit()
	ret = cursor.fetchone()

	print (ret)
Normale SQL-Abfragen funktionieren so, meine eigene nicht. Weder wird die Funktion ausgeführt noch bekomme ich eine Rückmeldung (Aber auch keine Fehlermeldung). Ich habe es auch mit cursor.callproc() versucht, aber das scheint auch wirklich nur mit Procedures zu funktionieren.
Wie kann ich die Funktion ausführen und den Int-Rückgabewert bekommen? Ich stehe hier etwas auf dem Schlauch, kenne mich auch nicht wirklich gut mit Python aus...

Content-Key: 275163

Url: https://administrator.de/contentid/275163

Ausgedruckt am: 28.03.2024 um 17:03 Uhr

Mitglied: wiesi200
wiesi200 20.06.2015 um 13:53:20 Uhr
Goto Top
Hallo,

ich hab zwar mit Python nicht's am Hut aber eigentlich bekommt man immer ein Array bei einer SQL Abfrage zurück und das wirst du vermutlich auch in Python entsprechen ansteuern müssen.
Mitglied: NativeMode
NativeMode 20.06.2015 um 15:33:48 Uhr
Goto Top
Das mit dem Array ist schon richtig, an anderer Stelle mache ich das auch so. Hier kommt aber nur eine Zahl zwischen 0 und 2 zurück (soll zumindest). Aber tatsächlich wird die Abfrage noch nicht mal durchgeführt, dies würde ich nämlich dann in der Tabelle sehen können.
Mitglied: 114757
114757 20.06.2015 aktualisiert um 15:47:32 Uhr
Goto Top
Mach doch eine Stored Procedure aus der Funktion:
http://www.mysqltutorial.org/calling-mysql-stored-procedures-python/

Gruß jodel32
Mitglied: NativeMode
NativeMode 21.06.2015 um 09:34:23 Uhr
Goto Top
Ich danke erst mal für die Antworten. Die Lösung habe ich selbst gefunden, hatte auch gar nichts mit Python zu tun:
Der DB-User mit dem die Abfragen ausgeführt werden, hatte keine Execute-Rechte für Routinen. Daran hatte ich nicht gedacht weil ich die Funktion als Root angelegt hatte.