2016-05-16 5 views
1

У меня возникла проблема с SP в mySql, когда я хочу выбрать свой идентификатор, он всегда дает значение null как значение.MySQL: Хранимая процедура возвращает null для last_insert_id

DELIMITER $$ 
CREATE PROCEDURE insert_details_facture(IN typefacture INT, 
       IN codeactivite VARCHAR(255), 
       IN qte INT, 
       IN pu DOUBLE, 
       IN unite VARCHAR(255), 
       IN montant DOUBLE) 
BEGIN 
DECLARE identete INT; 
SELECT identete = numfacture FROM entetefacture WHERE numfacture = LAST_INSERT_ID(); 
END$$ 

Когда я выполняю это, он дает identite = numfacture как имя столбца и null как значение.

CALL insert_details_facture(10,'l',10,12,'l',20) 

ответ

2

Проверить Here.

При отсутствии аргумента, LAST_INSERT_ID() возвращает значение BIGINT UNSIGNED (64-битный), представляющее первый автоматически сгенерированное значение успешно вставлен для столбца AUTO_INCREMENT в результате последней выполненной INSERT заявление.

поэтому результат, который вы получаете, очевиден.

для получения последней записи вы можете использовать лимит.

SET identete = (SELECT numfacture FROM entetefacture ORDER BY id DESC LIMIT 1); 
+0

Спасибо за ваш ответ, сейчас он работает. С уважением – zackzulg

1

Это слишком долго для комментария.

LAST_INSERT_ID() не гарантирует действительную ценность. Например, documentation состояния:

Если предыдущий оператор возвратил ошибку, значение LAST_INSERT_ID() не определено. Для транзакционных таблиц, если оператор откатывается из-за ошибки, значение LAST_INSERT_ID() остается неопределенным.

Аналогичным образом, если никаких изменений базы данных для текущего сеанса не было, значение будет неопределенным.

Кроме того, если вы хотите, чтобы установить значение, а затем использовать := в select:

SELECT identete := numfacture 
FROM entetefacture 
WHERE numfacture = LAST_INSERT_ID(); 

Почему бы не просто получить последнюю строку в таблице с помощью limit?

SET identete = (SELECT numfacture FROM entetefacture ORDER BY id LIMIT 1); 
Смежные вопросы