FROM
bagian dari SELECT
pernyataan harus memiliki nama tabel yang sebenarnya, bukan CHAR(100)
variabel yang berisi nama tabel. Ini tidak bekerja seperti ini.
Sepertinya Anda ingin menjalankan kueri tertentu terhadap banyak tabel dengan struktur serupa di database Anda. Cukup sering itu berarti bahwa skema database dapat ditingkatkan. Tetapi, jika Anda harus berurusan dengan apa yang Anda miliki, Anda harus menggunakan SQL dinamis . Tautan ke dokumentasi MySQL ini memiliki contoh "yang mendemonstrasikan cara memilih tabel untuk melakukan kueri saat runtime, dengan menyimpan nama tabel sebagai variabel pengguna", yang persis seperti yang Anda butuhkan.
Di dalam loop Anda, Anda perlu membuat string dengan kueri SQL dan menggunakan EXECUTE
.
SET @s = CONCAT('select count(distinct signature) from ', tableName);
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Sejauh yang saya mengerti, hasil dari EXECUTE
dikirim ke pemanggil prosedur tersimpan seolah-olah itu adalah SELECT
normal yang normal , jadi dalam contoh ini pemanggil akan menerima beberapa kumpulan hasil jika database Anda memiliki lebih dari satu tabel where table_name like "%FAULT_20150320%"
.
Berikut ini tautan ke pertanyaan SO lainnya tentang SQL dinamis MySQL Cara memiliki SQL Dinamis di MySQL Stored Procedure dengan beberapa contoh.
Sepertinya Anda menginginkan sesuatu seperti ini. Itu harus meringkas jumlah dari beberapa tabel di signatureCount
variabel.
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$$
Varian lain, jika jumlah tabel yang perlu Anda proses tidak banyak, adalah membangun secara dinamis satu pernyataan SQL besar yang mencakup semua tabel di dalam loop Anda dan kemudian EXECUTE
sekaligus:
SELECT
(COUNT(DISTINCT signature) FROM Table1) +
(COUNT(DISTINCT signature) FROM Table2) +
...
(COUNT(DISTINCT signature) FROM TableN) AS TotalCount