0

1)下面是我正在尝试的代码,我需要比较两个不同表的计数。(tbl1 和 tbl2 在要传递的参数中)。但在上面的代码中,“a”和“b”的值被设置为语句。我需要两个语句的结果值(计数)在“IF”条件下进行比较。

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
 @a=@b
 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
@a=@b
then 
select 1;
else
select 2;
end if;

希望那里的任何人都可以帮助我解决问题。

4

1 回答 1

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 注入(这有点粗略,但它是最好的,无需进一步信息即可)。

于 2013-05-01T11:13:44.233 回答