I have a problem where my function is only working when I don’t use the parameters that I pass.
Here is the code I would like to have work:
DELIMITER $$
CREATE DEFINER=`root`@`%` FUNCTION `getTableColumns`(schemaName varchar(100), tableName varchar(100), omitColumns varchar(200)) RETURNS varchar(5000) CHARSET latin1
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE res VARCHAR(5000) DEFAULT "";
DECLARE col VARCHAR(200);
DECLARE cur1 CURSOR FOR
select COLUMN_NAME from information_schema.columns
where table_schema = @schemaName AND table_name = @tableName AND FIND_IN_SET(COLUMN_NAME, @omitColumns) = 0 ORDER BY ORDINAL_POSITION;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cur1;
REPEAT
FETCH cur1 INTO col;
IF NOT done THEN
set res = CONCAT(res,IF(LENGTH(res)>0,",",""),col);
END IF;
UNTIL done END REPEAT;
CLOSE cur1;
RETURN res;
END
Here is the code that does works when I replace the parameters with literal strings:
DELIMITER $$
CREATE DEFINER=`root`@`%` FUNCTION `getTableColumns`(schemaName varchar(100), tableName varchar(100), omitColumns varchar(200)) RETURNS varchar(5000) CHARSET latin1
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE res VARCHAR(5000) DEFAULT "";
DECLARE col VARCHAR(200);
DECLARE cur1 CURSOR FOR
select COLUMN_NAME from information_schema.columns
where table_schema = 'test' AND table_name = 'employees' ORDER BY ORDINAL_POSITION;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cur1;
REPEAT
FETCH cur1 INTO col;
IF NOT done THEN
set res = CONCAT(res,IF(LENGTH(res)>0,",",""),col);
END IF;
UNTIL done END REPEAT;
CLOSE cur1;
RETURN res;
END
Try this: