2016-03-22 76 views
0

我已經定義了以下過程。在sql查詢中使用遊標提取變量的Mysql存儲過程


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 
 

運行此過程後,我收到錯誤db.tbl doesn't exist。 所以我在搜索是否有方法在另一個查詢中使用光標提取對象。我正在做所有這些乏味的事情的問題是,我想從一個特定的where子句的數據庫的所有表中刪除數據。 注意:所有表都有一個帶日期格式的列updated_at。 (我是MySQL存儲過程的新手)。

+0

過程的數據庫名和表數據庫名稱相同? –

+0

是的..這兩個數據庫是相同的 – Swaps

回答

0

使用Prepare Statement就可以獲取數據動態

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

酷!我認爲它的工作,但我在哪裏可以看到輸出? 因爲它是一個選擇查詢沒有更改數據庫將發生.. 我應該在哪裏最後的選擇語句wch將顯示選擇查詢的輸出? – Swaps

+0

這也是顯示的輸出,但如果你想放在一起,那麼你可以創建一個臨時表,並插入updated_at –

+0

其工作.. 我添加了外部選擇語句來顯示'@ b'&'tbl'變量的值。 ty :) – Swaps

1

在普通select語句的from子句中,您不能使用變量來替代表名,mysql將在數據庫中查找名爲tbl的表。

您需要使用字符串連接和prepared statements動態創建和執行SQL語句:

的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;

預處理語句在存儲過程中也行,上面的例子演示瞭如何創建SQL語句通過將字符串文字與變量連接起來,準備語句,執行它,然後從內存中釋放準備好的語句。

+0

但我怎麼能整合這個存儲過程? 如果你可以解釋這個前。與我的前任的背景。 這將是非常有益的.. :) – Swaps

+0

對不起,但我不明白你的問題!你使用和上面相同的命令,只需要用不同的方式聲明變量,但你已經知道如何做到這一點。 – Shadow

+0

我找到了你.. 我正在用像@VipinJain一樣的方式回答。 ty :) – Swaps