2015-06-04 32 views
0

我正在學習函數,過程和觸發器,我想做一個簡單的過程來計算表中的行參數。MySQL過程IN變量不能正常工作

create procedure countRows(IN v varchar(30)) 
SELECT COUNT(*) FROM v; 

有人能告訴我爲什麼,如果我這樣做:

call countRows('sometable'); 
call countRows(sometable); //I tried both 

它只是不工作

對不起,那新手的問題。

+0

你期望它做什麼?它如何失敗? – rghome

回答

3

您需要動態sql。

解返回作爲參數傳遞的任何表中的計數,以用上

DELIMITER $$ 

CREATE PROCEDURE `countRows`(IN v varchar(30)) 
    BEGIN 
    SET @t1 =CONCAT("SELECT COUNT(*) FROM ",V); 
    PREPARE stmt3 FROM @t1; 
    EXECUTE stmt3; 
    DEALLOCATE PREPARE stmt3; 
    END$$ 
DELIMITER ; 

執行

call countRows('sometable'); 

更新:溶液返回 「表X包含n個行(多個)」表格作爲參數傳遞給sp

DELIMITER $$ 

CREATE PROCEDURE `countRowsEx`(IN v VARCHAR(30)) 
    BEGIN 
    -- SET @t1 =CONCAT("SELECT COUNT(*) FROM ",V); 
    SET @t1 =CONCAT('SET @totalRows=(SELECT COUNT(*) FROM ',v, ');'); 
    PREPARE stmt3 FROM @t1; 
    EXECUTE stmt3; 
    DEALLOCATE PREPARE stmt3; 
    SELECT CONCAT('Table ', v, ' contains ', @totalRows, ' row', IF(@totalRows>1, 's','')); 
    END$$ 
DELIMITER ; 

執行

call countRowsEx('sometable'); 
+0

您應該添加分隔符'delimiter //創建過程..... end; // delimiter;'但+1目前爲止唯一正確的答案。 –

+0

對不起Anir,如果我想返回如下值:表X包含X行。這花了很長時間嘗試,但我仍然無法得到這個工作。 – Edw4rd

+0

@ Edw4rd,我已經爲您的要求添加了解決方案「表X包含N行」,請檢查更新後的答案。 – Anil

-1

試試這個:

call countRows('v'); 
1

您可以使用INFORMATION_SCHEMA這一點。

例如,要查找的行數與名稱表存儲在變量v使用這樣的:

select table_rows from information_schema.tables where table_name = v; 
+0

性能怎麼樣? – Anil

+0

你用動態sql回答比較好。 – vppuzakov