2016-11-25 19 views
1

Ich habe eine Stored Procedure in mySQL, die eine Teilmenge von Daten aus einer Tabelle übernimmt und eine Analyse dieser Teilmenge innerhalb einer temporären Tabelle durchführt. Hier ist mein Code:mySQL mehrere temporäre Tabellen erstellen

CREATE PROCEDURE GetPortfolioStats 
(
    InIdx_i  INT, 
    InStart_i INT, 
    InEnd_i  INT 
) 
BEGIN 

DECLARE myLimit  INT; 
DECLARE myOffset INT; 

SET myLimit = InEnd_i - InStart_i + 1; 
SET myOffset = InStart_i - 1; 

CREATE TEMPORARY TABLE IF NOT EXISTS myTmpTable AS (SELECT * FROM Leases WHERE Portfolio_i = InIdx_i ORDER BY Index_i LIMIT myLimit OFFSET myOffset); 

SET @Additive_i := (SELECT COUNT(Index_i) FROM myTmpTable WHERE ReviewType_vc = 'Additive'); 
DROP TABLE myTmpTable; 

SELECT @Additive_i; 

END; GO 

Das funktioniert gut. Das Problem, das ich habe, ist jedoch, dass es sich um eine Multithread-Anwendung handelt, und wenn mehrere Threads dieses gespeicherte Proc aufrufen, beginnen sie, die gleiche temporäre Tabelle zu teilen, was die Stats, die ich zu kompilieren versuche, vermasselt.

Gibt es eine Möglichkeit, entweder einen eindeutigen Tabellennamen auf jeden Aufruf des gespeicherten Proc anzuwenden oder den Bereich der temporären Tabelle auf genau diese Instanz des gespeicherten Proc zu beschränken?

Antwort

0

die spezifische Frage zu beantworten: die einfachste Lösung, eine andere Datenbankverbindung pro Thread zu verwenden, wäre da temporäre Tabellen session (connection) specific sind:

Sie das Schlüsselwort TEMPORARY verwenden können, wenn Sie eine Tabelle erstellen. Eine TEMPORARY-Tabelle ist nur für die aktuelle Sitzung sichtbar und wird beim Schließen der Sitzung automatisch gelöscht. Dies bedeutet, dass zwei verschiedene Sitzungen denselben Namen für die temporäre Tabelle verwenden können, ohne dass sie miteinander oder mit einer vorhandenen nicht temporären Tabelle mit demselben Namen in Konflikt stehen.

Doch nach dem eigentlichen Code Check-out, würde ich vorschlagen, nicht gar eine temporäre Tabelle zu verwenden, eine einzelne Abfrage mit einer Unterabfrage verwenden:

SELECT COUNT(Index_i) 
FROM 
    (SELECT Index_i, ReviewType_vc 
    FROM Leases 
    WHERE Portfolio_i = InIdx_i 
    ORDER BY Index_i 
    LIMIT myLimit OFFSET myOffset) t 
WHERE ReviewType_vc = 'Additive' 
+0

Ich hatte einen ähnlichen Gedanken, aber (für Kurz gesagt) Ich habe nur eine der Statistikberechnungen gezeigt - es sind ungefähr 14 von ihnen. Also, kopiere die relevanten Zeilen in eine temporäre Tabelle und berechne dann die 14 Stats, die mehr Sinn ergeben. Ich werde versuchen, verschiedene Verbindungen zu verwenden. – John

+0

Ich habe gerade versucht, Ihre Lösung zu sehen, wie es funktioniert, aber ich bekam das gleiche Problem. Für das innere SELECT habe ich AS T hinzugefügt und dann zusätzliche Analysen durchgeführt. Ich habe jedoch die falsche Anzahl von Zeilen zurückgegeben. Wenn ich ein 'AS T' mit dem inneren SELECT verwende, ist das 'T' für alle Threads sichtbar? – John

+0

Abschließender Kommentar - wenn ich der Verbindungszeichenfolge "POOLING = False" hinzufüge, bedeutet das, dass ich von jedem Thread eine andere Verbindung bekomme? – John

Verwandte Themen