Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.03.2014, 00:49   #1
Muramidaza
Пользователь
 
Регистрация: 08.01.2014
Сообщений: 53
По умолчанию Как сделать ветвление в хранимой процедуре

Хочу сделать ветвление в процедуре, чтобы если переменная qtyset больше нуля, то выполнялась транзакция:

Код:
DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `addinchek`(IN `IDS` INT, IN `QTS` INT, IN `IDP` INT)
    NO SQL
BEGIN
DECLARE idd INT;
DECLARE idc INT;
DECLARE iddc INT DEFAULT 0;
DECLARE dc INT DEFAULT 0;
DECLARE lprice FLOAT DEFAULT 0;
DECLARE price FLOAT DEFAULT 0;
DECLARE ida INT;
DECLARE qtyset INT;
SELECT IDDeliv INTO idd FROM recstore WHERE IDStore = IDS;
SELECT IDComm INTO idc FROM recstore WHERE IDStore = IDS;
SELECT Cost INTO price FROM recdeliv WHERE IDDeliv = idd;
SELECT IDApt INTO ida FROM listpers WHERE IDPers = IDP;
SELECT Qty INTO qtyset FROM recstore WHERE IDStore = IDS;
SET lprice = price * QTS;
SET qtyset = qtyset - QTS;
START TRANSACTION;
UPDATE recstore SET Qty = qtyset;
INSERT INTO recsalestmp (IDDeliv, IDComm, IDApt, Qty, IDPers, Cost) VALUES (idd, idc, ida, QTS, IDP, lprice);
COMMIT;
END$$
Заключаю START TRANSACTION ... COMMIT в BEGIN ... END; пишет ошибку. Процедура сейчас работает, но из-за отсутствия контроля образуется отрицательное количество товара на складе. В учебниках нашел только если в ветвлении участвует только одна строка типа Select одно и Select другое - как это в моем случае применить - не могу придумать, а транзакцию туда не дает вставить. СУБД MySQL 5.5.25.

Последний раз редактировалось Muramidaza; 24.03.2014 в 01:11.
Muramidaza вне форума Ответить с цитированием
Старый 24.03.2014, 18:17   #2
Muramidaza
Пользователь
 
Регистрация: 08.01.2014
Сообщений: 53
По умолчанию

Вот так правильно:

Код:
DELIMITER $$

CREATE DEFINER = `root`@`localhost` PROCEDURE `addinchek` ( IN `IDS` INT, IN `QTS` INT, IN `IDP` INT ) NOT DETERMINISTIC NO SQL SQL SECURITY DEFINER BEGIN DECLARE idd INT;

DECLARE idc INT;
DECLARE iddc INT DEFAULT 0;
DECLARE dc INT DEFAULT 0;
DECLARE lprice FLOAT DEFAULT 0;
DECLARE price FLOAT DEFAULT 0;
DECLARE ida INT;
DECLARE qtyset INT;
SELECT IDDeliv INTO idd FROM recstore WHERE IDStore = IDS;
SELECT IDComm INTO idc FROM recstore WHERE IDStore = IDS;
SELECT Cost INTO price FROM recdeliv WHERE IDDeliv = idd;
SELECT IDApt INTO ida FROM listpers WHERE IDPers = IDP;
SELECT Qty INTO qtyset FROM recstore WHERE IDStore = IDS;
SET lprice = price * QTS;
SET qtyset = qtyset - QTS;
IF qtyset >0 THEN BEGIN 
START TRANSACTION;
UPDATE recstore SET Qty = qtyset;
INSERT INTO recsalestmp( IDDeliv, IDComm, IDApt, Qty, IDPers, Cost ) VALUES (idd, idc, ida, QTS, IDP, lprice);
COMMIT;
END;
END IF;
END $$
Muramidaza вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Имена переменных в хранимой процедуре Muramidaza БД в Delphi 0 17.03.2014 22:44
Insert or Update в хранимой процедуре Dozent SQL, базы данных 4 15.10.2013 03:17
Как сделать в процедуре Event? Pcrepair Общие вопросы Delphi 4 23.03.2013 15:00
как проверить результат выполнения хранимой процедуры kizl БД в Delphi 2 09.05.2011 19:33
как отключить соединения с БД в хранимой процедуре Neymexa SQL, базы данных 0 06.04.2010 11:44