【问题标题】:SQL 5.1 Trigger syntax errorSQL 5.1 触发语法错误
【发布时间】:2012-07-06 18:45:39
【问题描述】:

我有这个触发器:

CREATE TRIGGER `VerficiaDispon` BEFORE INSERT ON `ordini` 
FOR EACH
ROW 
BEGIN 
DECLARE temp INT

SET temp = (SELECT disponibili FROM motoinstock 
            WHERE Moto = new.Moto_Comprata 
                AND Concessionario = new.Concessionario_Vendita);

IF temp = 0 OR temp IS NULL THEN SIGNAL SQLSTATE '45000' 
    SET MESSAGE_TEXT = 'Moto non disponibile';

END IF ;

SELECT acquisti
INTO temp
FROM clienticoncessionari
WHERE cliente = new.Cod_Cliente
AND concessionario = new.Concessionario_Vendita;

IF temp %2 =1 THEN SET new.Prezzo_Vendita = ( new.Prezzo_Vendita * 0.9 ) ;

END IF ;

END;

我不能让它在 sql 5.1 中工作。它在第 7 行给了我一个错误。我尝试选择 X 进入 temp,设置 temp=(...),但似乎没有任何效果。 我找不到 sintax 错误,有人可以帮我吗?必须是sql 5.1

【问题讨论】:

  • 我知道应该是 raise_application_error(8-2061,'derp');而不是 SIGNAL SQLSTATE...
  • 尝试在开头添加delimiter $$,在最后添加$$,并再次更改分隔符delimiter ;
  • 你的意思是这样吗?分隔符 $$ CREATE TRIGGER VerficiaDispon BEFORE INSERT ON ordini FOR EACH ROW BEGIN DECLARE temp INT SET temp = (SELECT disponibili FROM motoinstock WHERE Moto = new.Moto_Comprata AND Concessionario = new.Concessionario_Vendita;)$$ ?仍然无法正常工作。对不起,如果不是你的意思,我不擅长 sql

标签: mysql triggers syntax-error


【解决方案1】:
Delimiter $$

CREATE TRIGGER `VerficiaDispon` BEFORE INSERT ON `ordini` 
FOR EACH
ROW 
BEGIN 
DECLARE temp INT

SET temp = (SELECT disponibili FROM motoinstock 
            WHERE Moto = new.Moto_Comprata 
                AND Concessionario = new.Concessionario_Vendita);

IF temp = 0 OR temp IS NULL THEN SIGNAL SQLSTATE '45000' 
    SET MESSAGE_TEXT = 'Moto non disponibile';

END IF ;

SELECT acquisti
INTO temp
FROM clienticoncessionari
WHERE cliente = new.Cod_Cliente
AND concessionario = new.Concessionario_Vendita;

IF temp %2 =1 THEN SET new.Prezzo_Vendita = ( new.Prezzo_Vendita * 0.9 ) ;

END IF ;

END
$$

Delimiter ;

【讨论】:

  • 我总是遇到同样的错误:#1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 7 行的 'SET temp = (SELECT disponibili FROM motoinstock WHERE Moto = new.M' 附近使用正确的语法
【解决方案2】:

SIGNAL 语句仅在 MySQL 5.5 中可用。

在 5.1 的触发器中使用 SIGNAL 会导致语法错误,因为 MySQL 不知道这个语句。

【讨论】:

    【解决方案3】:

    好的,我几乎解决了所有问题。 现在代码是这样的:

    delimiter $$
    CREATE TRIGGER `VerficiaDispon` BEFORE INSERT ON `ordini` 
    FOR EACH
    ROW 
    BEGIN 
    
    DECLARE temp integer;
    SET temp = (SELECT disponibili FROM motoinstock 
                WHERE Moto = new.Moto_Comprata 
                    AND Concessionario = new.Concessionario_Vendita);
    
    IF temp=0 OR temp=NULL THEN
    RAISE_APPLICATION_ERROR(-20001,'NA');
    
    
    SET temp = ( SELECT acquisti FROM clienticoncessionari 
                 WHERE cliente = new.Cod_Cliente
                  AND concessionario = new.Concessionario_Vendita);
    
    IF temp %2 =1 THEN SET new.Prezzo_Vendita = ( new.Prezzo_Vendita * 0.9 ) ;
    
    END IF ;
    
    
    END
    delimiter ;
    

    现在我的问题是在 IF 上。我无法提出错误,由于某种原因 RAISE_APPLICATION_ERROR 不起作用。 其余的都很好。关于如何处理错误的任何想法?

    【讨论】:

      猜你喜欢
      • 2014-03-09
      • 2020-11-05
      • 1970-01-01
      • 1970-01-01
      • 2013-01-18
      • 2023-03-26
      • 2014-07-21
      • 2015-08-09
      相关资源
      最近更新 更多