Trying to create a conditional-based function that will return a result. I don’t if it’s the way I am setting the result value that is causing the error? Making MySQL throw the error code 1415 Not allowed to return a result set from a function.
x
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 cs_sp.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 ;
Advertisement
Answer
your code has multiple problems, but the bggest ist that you a using a “normal select, which would return a result set, which is not allowed.
so oyu can only use, SELECT .. INTO..FROM..WHERE
to get rid of the error message.
Iyour return Value doesn’t correspond with the variable ‘outputRes
they must be f the same datatype
MySQL 8 also wants a DETERMINIsTIC added
Below you see a working code sample, so that you can go from here, to whereever you want
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