#mysql #sql
Вопрос:
Я хочу уменьшить целое число из целого числа в хранимой процедуре, но я не получаю желаемого результата.
У меня есть следующие таблицы:
Таблица h(
i int
c int )
это имеет значение
i | c |
---|---|
1 | 100 |
Таблица k(
j int
c int
d текст
e метка времени)
это имеет значение
j | c | d | e |
---|---|---|---|
1 | 100 | нулевой | нулевой |
Я написал следующий код:
DROP PROCEDURE IF EXISTS a;
DELIMITER //
CREATE PROCEDURE a(b int, c int, d text, e timestamp)
BEGIN
DECLARE f INT;
SELECT c INTO @f FROM h WHERE i = j;
START TRANSACTION;
CASE WHEN (@f - c) < 0
THEN SIGNAL SQLSTATE "45000"
SET MESSAGE_TEXT = "@f - c < 0 is not allowed";
WHEN c < 0
THEN SIGNAL SQLSTATE "45000"
SET MESSAGE_TEXT = "c < 0 is not allowed";
WHEN j NOT IN (select i from h)
THEN SIGNAL SQLSTATE "45000"
SET MESSAGE_TEXT = "j does not exist";
ELSE
UPDATE h AS l SET c = (@f - c) WHERE j = i;
INSERT INTO k (d) VALUE (d);
INSERT INTO k (e) value (e);
END CASE;
COMMIT;
END //
DELIMITER ;
CALL a (1, 10, "changed -10", "2002-06-27 14:42:33");
SELECT * FROM h;
Таблица k обновлена правильно. Но таблица h-нет.
Я хочу получить следующие результаты, показанные для таблицы h, после
выполнения приведенного выше кода.
i | c |
---|---|
1 | 90 |
Но вместо этого я получаю
i | c |
---|---|
1 | 0 |
Что нужно изменить в моем коде, чтобы получить желаемый результат?
Комментарии:
1. Сначала вы выполняете
SELECT c INTO @g FROM h WHERE i = j;
. Затем вы выполняете некоторые «Если». Затем вы выполняетеUPDATE h AS l SET c = (@g - c) WHERE j = i;
. принимая во внимание, что@g
c
в этой строке равно, вы действительно хотите видеть что-то другое, кроме нуля?2. PS. НИКОГДА не вмешивайтесь в имена столбцов и имена локальных допустимых значений (параметры SP тоже являются локальными переменными).
3.
SELECT c INTO @g FROM h WHERE i = j;
Что такоеj
?4. Допустил ошибку, переменная f-это та, которая будет локальной переменной @f. Теперь я обновил код. j — столбец в таблице k.
5.
f
(объявленная локальная переменная) и@f
(определяемая пользователем переменная) являются двумя различными независимыми переменными.
Ответ №1:
В
SELECT c INTO @f FROM h WHERE i = j;
вы выбираете переменную (определяемую как параметр SP), а не значение столбца !!!
В вашем призыве это становится
SELECT 10 INTO @f FROM h WHERE i = j; -- parameter variable `c` gets the value 10.
Вы должны использовать
SELECT h.c INTO @f FROM h WHERE i = j;
Давайте я повторю:
НИКОГДА не вмешивайтесь в имена столбцов и имена локальных переменных (параметры SP тоже являются локальными переменными).
Кроме того, ваш SP завершится ошибкой, потому что он использует необъявленную переменную j
. По значению параметров/присвоенным значениям это должно быть b
…