【问题标题】:SQLyog Function: Syntax error when returning values from INNER JOINSQLyog 函数:从 INNER JOIN 返回值时出现语法错误
【发布时间】:2020-06-01 21:59:54
【问题描述】:

我正在编写一个 SQLyog 函数来根据客户花费的金额查找客户的状态。他们花费的金额位于支付表中,所有客户详细信息位于客户表中。

编辑:请注意,当输出只是 CustStatus 时,该函数有效,似乎问题与包含其他返回值有关。

这是我收到的错误:

错误代码:1064 您的 SQL 语法有错误;检查 与您的 MySQL 服务器版本相对应的手册 在 ' VARCHAR(50), VARCHAR(50), VARCHAR(10) 附近使用的语法 确定性

在第 2 行开始声明 k1 INT(11'

DROP FUNCTION IF EXISTS DTC_VIP_members $$
CREATE FUNCTION DTC_VIP_members (v1 INT(11))
RETURNS INT(11), VARCHAR(50), VARCHAR(50), VARCHAR(10) DETERMINISTIC 
BEGIN 
DECLARE k1 INT(11);
DECLARE CustStatus VARCHAR(10);
SELECT SUM(payment.SaleAmt) INTO k1
FROM payment
INNER JOIN clients
ON payment.client_id = clients.client_id
WHERE payment.client_id = v1;
IF k1 >= 300 THEN
    UPDATE clients  
    SET clients.CustStatus = 'VIP';
ELSE
    UPDATE clients  
    SET clients.CustStatus = 'Non-VIP';
END IF;
RETURN clients.client_id, clients.first_name, clients.last_name, clients.CustStatus;
END $$

DELIMITER ;

【问题讨论】:

    标签: mysql sql sqlyog


    【解决方案1】:

    抱歉,您的方法看起来不对。

    首先:我建议使用 STORED PROCEDURE 而不是 FUNCTION

    第二:使用UPDATE 语句而不使用WHERE 条件导致更新表中似乎也错误的所有行。

    所以我们的存储过程可以如下所示:

    DROP PROCEDURE IF EXISTS DTC_VIP_members $$
    CREATE PROCEDURE DTC_VIP_members (v1 INT(11))
    BEGIN 
        DECLARE k1 INT(11);
        DECLARE CustStatus VARCHAR(10);
    
        SELECT SUM(payment.SaleAmt) INTO k1
        FROM payment
        INNER JOIN clients
        ON payment.client_id = clients.client_id
        WHERE payment.client_id = v1;
    
        IF k1 >= 300 THEN
            UPDATE clients  
            SET clients.CustStatus = 'VIP'
            WHERE clients.client_id = v1; -- update only one record
        ELSE
            UPDATE clients  
            SET clients.CustStatus = 'Non-VIP'
            WHERE clients.client_id = v1; -- update only one record
        END IF;
    
        -- select relevant data
        SELECT 
            clients.client_id, clients.first_name, clients.last_name, clients.CustStatus 
        FROM clients
        WHERE clients.client_id = v1;
    END $$
    
    DELIMITER ;
    

    【讨论】:

      【解决方案2】:

      已解决! 感谢您花时间查看和回复 Slava! 是的,您的方法是一个更好的设计,并且可能会出现我所有愚蠢的 SQL 语法错误。 我了解到,使用我正在研究的 SQLyog 服务器版本,函数只能返回一个值。所以我的设计从一开始就有缺陷。

      由于 SQLyog 函数只能返回单个值“vip”或“non-vip”。 我尝试使用 select 来达到预期的效果。 选择名字,姓氏,...。 DTC_VIP_members(….);

      希望这个答案可以帮助任何其他尝试从免费版 SQLyog 学习 SQL 的初学者。 向左更新

         DELIMITER $$
      
          DROP FUNCTION IF EXISTS `DTC_VIP_members`$$ 
      
          CREATE DEFINER=`yadda`@`%` FUNCTION `DTC_VIP_members`(v1 INT(11)) RETURNS VARCHAR(10) CHARSET latin1 
              DETERMINISTIC 
          BEGIN 
              DECLARE k1 INT(11); 
              DECLARE CustStatus VARCHAR(10); 
              SELECT SUM(SaleAmt) INTO k1 
              FROM payment 
              WHERE client_id = v1; 
              IF k1 >= 300 THEN
                  SET CustStatus = 'VIP'; 
              ELSE
                  SET CustStatus = 'Non-VIP'; 
              END IF;
              RETURN CustStatus; 
              END$$
      
          DELIMITER ;
      
          --------------------------------------
      
          SELECT  first_name, last_name, email, mobile_number, `DTC_VIP_members`(client_id) 
          FROM clients; 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-05-04
        • 1970-01-01
        • 1970-01-01
        • 2015-01-30
        • 2021-06-22
        • 1970-01-01
        • 2020-06-11
        相关资源
        最近更新 更多