FROM
część SELECT
Instrukcja musi mieć rzeczywiste nazwy tabel, a nie CHAR(100)
zmienna zawierająca nazwę tabeli. To po prostu tak nie działa.
Wygląda na to, że chcesz uruchomić określone zapytanie w wielu tabelach o podobnej strukturze w Twojej bazie danych. Często oznacza to, że schemat bazy danych można by poprawić. Ale jeśli masz do czynienia z tym, co masz, musisz użyć dynamiczny SQL . To łącze do dokumentacji MySQL zawiera przykład „pokazujący, jak wybrać tabelę, na której chcesz wykonać zapytanie w czasie wykonywania, przechowując nazwę tabeli jako zmienną użytkownika”, czyli dokładnie to, czego potrzebujesz.
Wewnątrz pętli musisz zbudować ciąg z zapytaniem SQL i użyć EXECUTE
.
SET @s = CONCAT('select count(distinct signature) from ', tableName);
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
O ile rozumiem, wynik EXECUTE
jest wysyłany do wywołującego procedury składowanej tak, jakby był to normalny SELECT
, więc w tym przykładzie osoba wywołująca otrzyma wiele zestawów wyników, jeśli baza danych zawiera więcej niż jedną tabelę where table_name like "%FAULT_20150320%"
.
Oto link do innego pytania SO dotyczącego dynamicznego SQL MySQL Jak mieć dynamiczny SQL w procedurze przechowywanej MySQL z kilkoma przykładami.
Wygląda na to, że chcesz czegoś takiego. Powinien zsumować zliczenia z kilku tabel w signatureCount
zmienna.
CREATE PROCEDURE CountSignatures()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE signatureCount INT;
DECLARE tableName CHAR(100);
DECLARE tableList CURSOR FOR SELECT table_name FROM information_schema.tables WHERE table_name LIKE "%FAULT_20150320%";
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
SET signatureCount = 0;
OPEN tableList;
tableListLoop: LOOP
SET done = FALSE;
FETCH tableList INTO tableName;
IF done THEN
LEAVE tableListLoop;
END IF;
SET @VarCount = 0;
SET @VarSQL = CONCAT('SET @VarCount = (SELECT COUNT(DISTINCT signature) FROM ', tableName, ')');
PREPARE stmt FROM @VarSQL;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET signatureCount = signatureCount + @VarCount;
END LOOP;
CLOSE tableList;
SELECT signatureCount;
END$$
Innym wariantem, jeśli liczba tabel, które musisz przetworzyć, jest niewielka, jest dynamiczne zbudowanie jednej dużej instrukcji SQL, która zawiera wszystkie tabele w pętli, a następnie EXECUTE
to za jednym zamachem:
SELECT
(COUNT(DISTINCT signature) FROM Table1) +
(COUNT(DISTINCT signature) FROM Table2) +
...
(COUNT(DISTINCT signature) FROM TableN) AS TotalCount