Reputation: 213
I wish to retrieve all distinct values of a column (Task in this case) from a table (dataset in this case). The task values will go as column name for the table that I intend to create using the procedure (albeit not defined currently but only printed). But it gives an error at the line
SET qry = CONCAT("CREATE TABLE ",tblname," ( TEAM varchar(20) PRIMARY KEY ," );
saying end was missing. When I put end it says semicolon is missing and vice-versa.
DELIMITER //
CREATE PROCEDURE `createTable` (IN tblName varchar(20))
BEGIN
DECLARE task varchar(20) DEFAULT "";
DECLARE exit_loop BOOLEAN;
SET qry = CONCAT("CREATE TABLE ",tblname," ( TEAM varchar(20) PRIMARY KEY ," );
DECLARE task_curs CURSOR FOR SELECT DISTINCT Task FROM dataset;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET exit_loop = TRUE;
OPEN task_curs;
my_loop: loop
FETCH task_curs into task;
qry=CONCAT(qry,task, ' INT DEFAULT 0, ');
IF exit_loop THEN
CLOSE task_curs;
LEAVE my_loop;
END IF;
END LOOP my_loop;
qry=TRIM(TRAILING ',' FROM qry);
qry=CONCAT(qry, ');');
SELECT qry;
END; //
DELIMITER ;
What might be possibly wrong with the syntax ? Thanks!
Upvotes: 0
Views: 108
Reputation: 16551
Try:
DELIMITER //
CREATE PROCEDURE `createTable` (IN tblName varchar(20))
BEGIN
DECLARE task varchar(20) DEFAULT "";
DECLARE exit_loop BOOLEAN;
DECLARE qry VARCHAR(500);
-- SET qry = CONCAT("CREATE TABLE ",tblname," ( TEAM varchar(20) PRIMARY KEY ," );
DECLARE task_curs CURSOR FOR SELECT DISTINCT Task FROM dataset;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET exit_loop = TRUE;
SET qry = CONCAT("CREATE TABLE ",tblname," ( TEAM varchar(20) PRIMARY KEY ," );
OPEN task_curs;
my_loop: loop
FETCH task_curs into task;
-- qry=CONCAT(qry,task, ' INT DEFAULT 0, ');
-- SET qry=CONCAT(qry,task, ' INT DEFAULT 0, ');
IF exit_loop THEN
CLOSE task_curs;
LEAVE my_loop;
END IF;
SET qry=CONCAT(qry,task, ' INT DEFAULT 0, ');
END LOOP my_loop;
-- qry=TRIM(TRAILING ',' FROM qry);
SET qry=TRIM(TRAILING ',' FROM qry);
-- qry=CONCAT(qry, ');');
SET qry=CONCAT(qry, ');');
SELECT qry;
END; //
DELIMITER ;
Upvotes: 1