2013-05-01 6 views
0

1) Ниже приведен код, в котором я пытаюсь выполнить процедуру, когда мне нужно сравнить счет из двух разных таблиц. (tbl1 и tbl2 находятся в параметрах, которые должны быть переданы). Но в приведенном выше коде значения для 'a' и 'b' заданы как инструкции. Мне нужно результирующее значение (счет) из двух операторов для сравнения в условии «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

что не так с вышеуказанным кодом? кажется правильным ... –

+0

Что вы пытаетесь сделать? Пожалуйста, объясните немного больше. Похоже, вы усложняете вещи. –

+0

1) Почему у вас есть имена переменных таблиц? Это обычно указывает на плохо денормализованную схему. 2) Это похоже на бизнес-логику - действительно ли она принадлежит базе данных? – eggyal

ответ

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 (это немного грубо, но это лучшее, что можно сделать без дополнительной информации).