2015-06-04 3 views
2

Я пытаюсь сделать несложную процедуру в моей MySQL:Как объявить переменную внутри процедуры MYSQL

DELIMITER $$ 

CREATE PROCEDURE `countRows`(IN v varchar(30)) 
    BEGIN 
    DECLARE e INT DEFAULT 0; 
    SET @t1 =CONCAT("SELECT COUNT(*) FROM ",V, " INTO",e); 
    PREPARE stmt3 FROM @t1; 
    EXECUTE stmt3; 
    DEALLOCATE PREPARE stmt3; 
    SELECT CONCAT("The ",V," table contains ",e," rows"); 
    END$$ 
DELIMITER ; 

EDIT: Все работает правильно, но @ t1 не сохраняет значение в переменной, так что заставляет второй запрос показывать 0 по умолчанию всегда.

Я не вижу никакой синтаксической ошибки, некоторые советы для этой работы, пожалуйста?

ответ

2

Для утверждения в @t2; нет необходимости в подготовленном заявлении, поскольку он не содержит каких-либо операторов SQL для выполнения. Нижеследующие 3 строки кода не нужны.

PREPARE stmt3 FROM @t2; 
EXECUTE stmt3; 
DEALLOCATE PREPARE stmt3; 

Вы можете просто показать его как

SET @t2 =CONCAT("The ",V," table contains ",e," rows"); 
SELECT @t2; 

(OR) Just

SELECT CONCAT("The ",V," table contains ",e," rows"); 

С, что ваша процедура должна выглядеть

DELIMITER $$ 
CREATE PROCEDURE `countRows`(IN v varchar(30)) 
BEGIN 
DECLARE e INT DEFAULT 0; 
SET @t1 =CONCAT("SELECT COUNT(*) FROM ",V, " INTO",e); 
SET @t2 =CONCAT("The ",V," table contains ",e," rows"); 
PREPARE stmt3 FROM @t1; 
EXECUTE stmt3; 
DEALLOCATE PREPARE stmt3; 
SELECT @t2; 
END$$ 
DELIMITER ; 

EDIT:

Попробуйте как этот раз, используя определенные пользователем переменной (тело процедуры ниже)

DELIMITER $$ 
CREATE PROCEDURE `countRows`(IN v varchar(30)) 
    BEGIN 
    SET @e := 0; 
    SET @t1 =CONCAT("SELECT COUNT(*) INTO @e FROM ",V); 
    PREPARE stmt3 FROM @t1; 
    EXECUTE stmt3; 
    DEALLOCATE PREPARE stmt3; 
    SELECT CONCAT("The ",V," table contains ",@e," rows"); 
    END$$ 
DELIMITER ; 
+0

Я редактирую свой вопрос. Все работает, но @ t1 не сохраняет значение запроса в переменной e, всегда 0 (по умолчанию) – Edw4rd

+0

У вас действительно есть записи в вашей таблице? проверьте один раз. – Rahul

+0

Конечно, первый запрос работает нормально. – Edw4rd

1

Поскольку, как вы отметили, вы указали переменную e в хранимой процедуре, она не существует за пределами этой среды.

Я думаю, что проблема лежит здесь:

SET @t1 =CONCAT("SELECT COUNT(*) FROM ",V, " INTO e");

попытаться изменить это:

SET @t1 =CONCAT("SELECT COUNT(*) FROM ",V, " INTO",e);

+0

Проверьте обновленный вопрос пожалуйста. – Edw4rd

Смежные вопросы