MYSQL 函数创建错误 #1415:不允许 return 函数的结果集

MYSQL Error #1415 on Function Creation: Not allowed to return a result set from a function

正在尝试创建一个基于条件的函数来 return 结果。我不知道这是不是我设置导致错误的结果值的方式?使 MySQL 抛出错误代码 1415 Not allowed to return a result set from a function.

DELIMITER $$

CREATE FUNCTION GetTechFull ( table_flag INT,person_pk CHAR(11) )
RETURNS INT

BEGIN

    DECLARE firstName VARCHAR(64);
    DECLARE lastName VARCHAR(64);
    DECLARE outputRes VARCHAR(64) DEFAULT NULL;

    IF table_flag IS NULL OR person_pk IS NULL THEN
        RETURN NULL;
    END IF;
    IF table_flag = 1 THEN
        SELECT CONCAT(LEFT(ResFirstName,1), " ", ResLastName) as name,ResPhone as telephone, TPGText as pay_grade FROM cpts451_secretproject_rds.ww_techfull;
        SET outputRes =  CONCAT(LEFT(firstName,1), " ", lastName);
    END IF;
    IF table_flag = 0 THEN
        SELECT stdFirstName,stdLastName INTO firstName,lastName FROM student WHERE student.stdNo = person_pk;
        SET outputRes =  CONCAT(LEFT(firstName,1), " ", lastName);
    END IF;
    RETURN outputRes;
END$$

DELIMITER ;

您不能在将结果发送到输出流的函数中使用 common SELECT。您必须使用 SELECT .. INTO {variables list}.


您可以不使用中间变量并应用RETURN (SELECT {output column/expression} FROM ... WHERE ... ORDER BY ... LIMIT 1)。括号阻止将输出发送到输出流并将其转换为标量值。 ORDER BY LIMIT 1 在这种情况下强烈建议使用,即使现在保证 1 行输出 - 将来可能会变得不正确...


您的函数不处理 table_flag 除 NULL、0 或 1(可以使用,甚至是错误的)以外的值。我建议您使用

CASE table_flag WHEN 0 
                THEN RETURN ( {query 1} );
                WHEN 1 
                THEN RETURN ( {query 2} );
                ELSE RETURN NULL;
END CASE;

您的代码有多个问题,但最大的问题是您使用的是“正常 select,这会 return 一个结果集,这是不允许的。

所以oyu只能用,SELECT .. INTO..FROM..WHERE去掉报错信息

你的 return 值与变量不对应 outputRes它们必须是相同的数据类型

MySQL 8 还想添加一个 DETERMINIsTIC

下面是一个工作代码示例,因此您可以从这里转到任何您想去的地方

CREATE tABLE student(stdNo int, stdFirstName VARCHAR(64), stdLastName VARCHAR(64))
INSERT INTO student VALUES(1,'test2','testlast')
CREATE TABLe ww_techfull(ResNo int, ResFirstName VARCHAR(64), ResLastName VARCHAR(64)
,ResPhone varchar(16),TPGText varchar(64))
INSERT INTO  ww_techfull VALUES(1,'testfrist', 'Testlast','012345656778','Bad')
CREATE FUNCTION GetTechFull ( table_flag INT,person_pk CHAR(11) )
RETURNS CHAR(64) DETERMINISTIC

BEGIN

    DECLARE firstName CHAR(64);
    DECLARE lastName CHAR(64);
    DECLARE telephone CHAR(64);
    DECLARE pay_grade CHAR(64);
    DECLARE outputRes CHAR(64) DEFAULT NULL;

    IF table_flag IS NULL OR person_pk IS NULL THEN
        RETURN NULL;
    END IF;
    IF table_flag = 1 THEN
        SELECT LEFT(CONCAT(LEFT(ResFirstName,1), " ", ResLastName),64) 
        ,ResPhone  , TPGText 
        INTO outputRes
        ,telephone,  pay_grade 
        FROM ww_techfull WHERE ResNo = person_pk;
        SET outputRes =  LEFT(outputRes,64);
    END IF;
    IF table_flag = 0 THEN
        SELECT LEFT(CONCAT(LEFT(stdFirstName,1), " ",stdLastName),64) INTO outputRes 
        FROM student WHERE student.stdNo   = person_pk;
        SET outputRes =  LEFT(outputRes,64);
    END IF;
    RETURN outputRes;
END
SELECT GetTechFull(0,1)
| GetTechFull(0,1) |
| :--------------- |
| t testlast       |
SELECT GetTechFull(1,1)
| GetTechFull(1,1) |
| :--------------- |
| t Testlast       |

db<>fiddle here