2013-05-01 117 views
0

1)下面是我正在嘗試的代碼,我需要比較兩個不同表的計數。 (tbl1和tbl2在要傳遞的參數中)。 但在上面的代碼中,'a'和'b'的值被設置爲語句。我需要兩個語句的結果值(count)在'IF'條件下進行比較。比較兩個sql語句的結果的過程

declare a integer; 
declare b integer; 

set @a:=concat('select count(*) from ', tbl1); 
/*PREPARE stmt1 FROM @a; 
execute stmt1; 
deallocate PREPARE stmt1;*/ 

set @b:= concat('select count(*) from ', tbl2); 
/*PREPARE stmt2 FROM @b; 
execute stmt2; 
deallocate PREPARE stmt2;*/ 


if 
@[email protected] 
then 
select 1; 
else 
select 2; 
end if; 

2)實際上,當我在過程中將「tbl1」和「tbl2」設置爲參數時,我遇到了問題。 下面的代碼工作正常,如果表名直接給出,但我需要它們作爲參數。

CREATE PROCEDURE myproc (in tbl1 varchar(50), in tbl2 varchar(50)) 

declare a integer; 
declare b integer; 

set @a:=(select count(*) from tbl1); 
/*PREPARE stmt1 FROM @a; 
execute stmt1; 
deallocate PREPARE stmt1;*/ 

set @b:= (select count(*) from tbl2); 
/*PREPARE stmt2 FROM @b; 
execute stmt2; 
deallocate PREPARE stmt2;*/ 

if 
@[email protected] 
then 
select 1; 
else 
select 2; 
end if; 

希望有人在那裏可以幫我解決方案。

+0

上面的代碼有什麼問題?它似乎是正確的... – 2013-05-01 10:44:59

+0

你想做什麼?請多解釋一下。似乎你正在複雜的事情。 – 2013-05-01 10:45:50

+0

1)爲什麼你有變量表名稱?這通常表示嚴重非規範化的模式。 2)這感覺就像商業邏輯 - 它真的屬於數據庫嗎? – eggyal 2013-05-01 10:46:45

回答

0

如上評論所提到的,很可能是你不應該在所有這樣做......但是,對於它的價值:

SET @sql := CONCAT('SELECT (
    SELECT COUNT(*) FROM `',REPLACE('`','``',tbl1),'` 
) = (
    SELECT COUNT(*) FROM `',REPLACE('`','``',tbl2),'` 
);'); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

SET @sql := NULL; 

REPLACE()已被用來儘量避免SQL注射(這是有點粗糙,但它是最好的沒有進一步的信息可以做)。