sqlyog函数:从内部连接返回值时语法错误

izj3ouym  于 2021-08-13  发布在  Java
关注(0)|答案(2)|浏览(360)

我正在编写一个sqlyog函数,根据客户花费的金额来查找客户的状态。他们花费的金额位于payment表中,所有客户的详细信息都位于clients表中。
编辑:注意,当输出只是 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 ;
xcitsw88

xcitsw881#

抱歉,你的方法看起来不对。
第一:我建议使用存储过程代替函数
第二:使用 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 ;
ccgok5k5

ccgok5k52#

解决了的!感谢您抽出时间查看并回复斯拉瓦语!是的,你的方法是一个更好的设计,可能会我所有愚蠢的sql语法错误。我了解到,对于我正在使用的sqlyog服务器版本,函数只能返回一个值。所以我的设计从一开始就有缺陷。
因为sqlyog函数只能返回单个值“vip”或“non-vip”。我试着用一个select来达到预期的效果。选择名字、姓氏…。dtc成员(…);
希望这个答案能帮助其他试图从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;

相关问题