2015-09-25 2 views
0

Je veux exécuter des commandes SQL généré l'exécution dans une transaction, il n'y a pas de problème, mais je devrais commencer cette transaction si une condition est vrai, par exemple:MySQL: démarrer la transaction si une condition est vraie

SQLText := 'IF (SELECT COUNT(ID) FROM desk_table WHERE Status = 1 AND Number = ' 
      + IndDeskGrid.DataSource.DataSet.FieldByName('Number').AsString + ' > 0) BEGIN ' 
      + 'SET autocommit = 0;' 
      + 'START TRANSACTION;' 
      + 'INSERT INTO waiting_table (UName, DNumber, MDate, HDate, HaveReq)' 
      + ' VALUES (' + QuotedStr(User.UName) + ', ' 
      + IndDeskGrid.DataSource.DataSet.FieldByName('Number').AsString 
      + ', ' + QuotedStr(MTodayString) + ', ' + QuotedStr(HTodayString) + ', 2);' 
      + 'UPDATE desk_table SET Status = 2 WHERE Number = ' 
      + IndDeskGrid.DataSource.DataSet.FieldByName('Number').AsString + ';' 
      + 'COMMIT;' 
      + 'SET autocommit = 1;' 
      + 'END;'; 

SQL généré:

IF (SELECT COUNT(ID) FROM desk_table WHERE Status = 1 AND Number = 202 > 0) 
BEGIN 
SET autocommit = 0; 
START TRANSACTION; 
INSERT INTO waiting_table (UName, DNumber, MDate, HDate, HaveReq) 
VALUES ('UserName', 202, '2015/09/25', '2015/09/25', 2); 
UPDATE desk_table SET Status = 2 WHERE Number = 202; 
COMMIT; 
SET autocommit = 1; 
END; 

mais quand je l'utilise si comme code ci-dessus, je suis erreur de syntaxe

J'ai essayé IF..THEN..ENDIF et je suis arrivé même erreur

Comment est-ce que je peux faire cela sans employer des procédures stockées et des paramètres?!

I`m En utilisant UniDAC et Delphi XE6 et MySQL (InnoDB)

... merci

+0

Vous pouvez exécuter la première partie de la requête 'SELECT COUNT (ID) DE desk_table OU Statut = 1 ET ....' et vous pouvez exécuter deuxième partie selon le résultat. Pas dans un SQL. –

+0

Mais je devrais le faire en une seule partie –

+0

Quelle est la raison du début de la transaction conditionnelle? Je ne peux imaginer aucun cas d'utilisation utile pour cela. –

Répondre

0

Utiliser une variable locale pour stocker le résultat de la requête de comptage, puis utiliser la variable dans la condition if.

declare @total int 
SELECT @total = COUNT(ID) FROM desk_table WHERE Status = 1 AND Number = 202; 
IF (@total > 0) 
BEGIN 
SET autocommit = 0; 
START TRANSACTION; 
INSERT INTO waiting_table (UName, DNumber, MDate, HDate, HaveReq) 
VALUES ('UserName', 202, '2015/09/25', '2015/09/25', 2); 
UPDATE desk_table SET Status = 2 WHERE Number = 202; 
COMMIT; 
SET autocommit = 1; 
END; 
+1

J'ai eu une erreur avec cette syntaxe, l'avez-vous testé?! –

0

acutaly il est end if; que vous devez mettre à la fin