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
正在尝试创建一个基于条件的函数来 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