【发布时间】:2015-09-25 13:13:57
【问题描述】:
我想在一个Transaction中执行一些运行时生成的SQL命令,没有问题,但是如果条件为真我应该启动这个事务,例如:
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:
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;
但是当我像上面的代码一样使用 IF 时,我得到了语法错误
我尝试了 IF..THEN..ENDIF 并得到同样的错误
如何在不使用存储过程和参数的情况下做到这一点?!
我正在使用 UniDAC 和 Delphi XE6 和 MySQL(InnoDB)
谢谢...
【问题讨论】:
-
您可以执行查询
SELECT COUNT(ID) FROM desk_table WHERE Status = 1 AND ....的第一部分,然后您可以根据结果执行第二部分。不在一个 SQL 中。 -
但我应该做一个部分
-
条件事务启动的原因是什么?我无法想象任何有用的用例。
-
如果条件为真,我应该做作业,如果我在条件之前开始交易,我应该回滚!无论如何,我创建了一个 SP 并现在使用,没有问题,谢谢...
-
嗯,在事务性 DBMS 中总是 有一个事务!但是您可以覆盖每条语句的默认自动提交。所以这根本没有意义。只需使用
con.StartTransaction; try qry.ExecSQL; con.Commit; except con.Rollback; raise; end;执行您的一堆语句,并且语句中没有事务处理。会好的
标签: mysql sql delphi transactions unidac