Вычитание целого числа из целого числа в хранимой процедуре (версия SQL 8.0.23)

#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