【问题标题】:MySQL : start Transaction if a condition was trueMySQL:如果条件为真,则启动事务
【发布时间】: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


【解决方案1】:

使用局部变量存储count查询的结果,然后在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;

【讨论】:

  • 我这个语法有错误,你测试了吗?!
【解决方案2】:

你必须把end if;放在最后

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-11
    • 1970-01-01
    • 2020-06-25
    • 2012-06-28
    • 2014-04-01
    • 2016-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多