2013-04-16 7 views
1
CREATE DEFINER=`root`@`localhost` PROCEDURE `add_item`(
     IN parentId BIGINT UNSIGNED, IN jobId BIGINT UNSIGNED, 
     OUT id BIGINT UNSIGNED) 
    BEGIN 
     DECLARE newLeft INT UNSIGNED DEFAULT 0; 

     SELECT `RGT` into newLeft from `headings` where `ID`=parentId LIMIT 1; 

     /* ERROR TRAP */ 
     IF (newLeft=0) OR (newLeft=NULL) THEN SET newLeft=1; 
     END IF; 

Проблема: я не могу выбрать результат в локальной переменной newLeft, он всегда равен 1 (или 0, если я удалю ошибку). Я что-то упускаю? Я пробовал так много разных подходов, даже добавляя «INTO newLeft» в конец инструкции SELECT.Невозможно назначить локальную переменную внутри хранимой процедуры на MYSQL

Использование MYSQL 5.4 на тестовой машине, которая для Windows 7 с помощью IIs

+0

Вы уверены, что в таблице заголовков есть строка с идентификатором parentId? Как выглядит вызов вашей процедуры? – Walid

+0

parentId - это переданный параметр, и идентификатор есть. SELECT отлично работает, так как он также не смог сохранить результат в локальной переменной в других операторах SELECT в хранимой процедуре. – user1401768

+0

Это должно быть ошибка MYSQL, я даже попробовал: – user1401768

ответ

0

РЕШЕНИЕ:

MYSQL будет использовать локальные переменные или параметры, прежде чем он использует поля в таблице выбора внутри хранимой процедуры, если они одинаковы имя, и это не чувствительно к регистру. Обратите внимание на то, что , где ID = parentId, на самом деле спрашивает, где 0 = parentId (переменная id = 0 в этой точке), поскольку идентификатор является локальным параметром, а также поле в таблице, но локальные переменные имеют точность.

Изменение имени параметра OUT от id до outid исправлена ​​проблема.

Я полагаю, я мог бы изменить выбор, чтобы:

SELECT `RGT` into newLeft from `headings` where `headings`.`ID`=parentId LIMIT 1; 

Я не пробовал это, я просто изменил имя параметра OUT.

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