2016-03-22 8 views
0

Ich habe eine folgende Prozedur definiert.Mysql gespeicherte Prozedur mit Cursor abgerufene Variable in SQL-Abfrage


create procedure deleteData() 
    begin 
    DECLARE no_tbls INT; 
    DECLARE tbl VARCHAR(64); 
    DECLARE tbls_cr CURSOR for SELECT DISTINCT table_name FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema='db'; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_tbls=1; 
    OPEN tbls_cr; 
    SET no_tbls=0; 
    while no_tbls=0 do 
     fetch tbls_cr into tbl; 
     select tbl.updated_at from tbl limit 1; 
    end while; 
    close tbls_cr; 
    end 
 

Nach dieser Prozedur läuft i db.tbl doesn't exist eine Störung erhalte. Also ich suchte, ob es eine Möglichkeit gibt, ein cursor abgerufenes Objekt in einer anderen Abfrage zu verwenden. Das Problem, das ich all diese langweiligen Sachen mache, ist, dass ich Daten aus allen Tabellen einer db mit einer bestimmten where-Klausel löschen möchte. Hinweis: Alle Tabellen haben eine Spalte updated_at mit Datumsformat. (Ich bin ein Neuling zu MySQL gespeicherten Procs).

+0

Prozedur des Datenbanknamen und Tabellen Datenbanknamen identisch sind? –

+0

ja .. beide DBs sind die gleichen – Swaps

Antwort

0

Prepare Statement verwenden Sie können Daten holen dynamisch

create procedure deleteData() 
    begin 
    DECLARE no_tbls INT; 
    DECLARE tbl VARCHAR(64); 
    DECLARE tbls_cr CURSOR for 
     SELECT DISTINCT table_name 
     FROM INFORMATION_SCHEMA.COLUMNS 
     WHERE table_schema='db'; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_tbls=1; 
    OPEN tbls_cr; 
    start_loop : LOOP 
     fetch tbls_cr into tbl; 
     set @b = concat('select ', tbl, '.updated_at from ' , tbl, ' limit 1'); 
     prepare stmt3 from @b; 
     execute stmt3; 
     DEALLOCATE PREPARE stmt3;   
    END LOOP start_loop; 
    close tbls_cr; 
    end 
+0

Kühl !! Ich denke, es funktioniert, aber wo kann ich die Ausgabe sehen? Da es sich um eine Select-Abfrage handelt, werden keine Änderungen an der DB vorgenommen. Wo sollte ich die final select-Anweisung setzen wch zeigt die Ausgabe einer Select-Abfrage an? – Swaps

+0

Dies zeigt auch die Ausgabe, aber wenn Sie zusammenstellen möchten, dann können Sie eine temporäre Tabelle erstellen und setzen –

+0

seine Arbeit Ich fügte externe Select-Anweisungen, um Werte von '@ b' &' tbl' Variablen anzuzeigen. ty :) – Swaps

1

Sie können keine Variable anstelle eines Tabellennamens in der from-Klausel in einer plain select-Anweisung haben, mysql sucht in der Datenbank nach einer Tabelle mit dem Namen tbl.

Sie müssen String-Verkettung verwenden und prepared statements dynamisch erstellen und SQL-Anweisungen ausführen:

mysql>USE test;

mysql>CREATE TABLE t1 (a INT NOT NULL);

mysql>INSERT INTO t1 VALUES (4), (8), (11), (32), (80);

mysql>SET @table = 't1';

mysql>SET @s = CONCAT('SELECT * FROM ',@table);

mysql>PREPARE stmt3 FROM @s;

mysql>EXECUTE stmt3;

mysql>DEALLOCATE PREPARE stmt3;

Prepared Statements auch in gespeicherten Prozeduren arbeiten, zeigt das obige Beispiel, wie die SQL-Anweisung erstellen Indem Sie String-Literale mit Variablen verketten, bereiten Sie die Anweisung vor, führen Sie sie aus und geben Sie dann die vorbereitete Anweisung aus dem Speicher frei.

+0

aber wie kann ich dies in einem gespeicherten proc integrieren? wenn Sie das ex erklären können. mit dem Kontext meiner Ex. wird es sehr hilfreich sein .. :) – Swaps

+0

Es tut mir leid, aber ich verstehe deine Frage nicht! Sie verwenden dieselben Befehle wie oben, nur die Variablen müssen anders deklariert werden, aber Sie wissen bereits, wie das geht. – Shadow

+0

Ich habe dich .. Ich versuchte auf die gleiche Weise wie @VipinJain antwortete. ty :) – Swaps

Verwandte Themen