12 messages in com.mysql.lists.win32Re: 5.0.15 Stored Procedures| From | Sent On | Attachments |
|---|---|---|
| Melissa Dougherty | 04 Nov 2005 05:34 | |
| SGr...@unimin.com | 04 Nov 2005 06:50 | |
| Melissa Dougherty | 04 Nov 2005 10:12 | |
| SGr...@unimin.com | 04 Nov 2005 10:26 | |
| Melissa Dougherty | 07 Nov 2005 06:47 | |
| Fredrick Bartlett | 07 Nov 2005 08:14 | |
| Reggie Burnett | 08 Nov 2005 06:25 | |
| Fredrick Bartlett | 08 Nov 2005 09:00 | |
| Warren | 08 Nov 2005 09:48 | |
| Jorge Bastos | 08 Nov 2005 10:57 | |
| Daniel da Veiga | 08 Nov 2005 11:53 | |
| Reggie Burnett | 08 Nov 2005 13:20 |
| Subject: | Re: 5.0.15 Stored Procedures![]() |
|---|---|
| From: | SGr...@unimin.com (SGr...@unimin.com) |
| Date: | 11/04/2005 06:50:08 AM |
| List: | com.mysql.lists.win32 |
"Melissa Dougherty" <meli...@cse-corp.com> wrote on 11/04/2005 08:35:18 AM:
I'm need to the procedures in MySQL.... I'm trying to build dynamic SQL, similar to MS SQL Server. Can anyone tell me what's wrong with this procedure?
DELIMITER $$
DROP PROCEDURE IF EXISTS `goes_modules`.`RPT_WorkForcePlan_SP`$$ CREATE PROCEDURE `goes_modules`.`RPT_WorkForcePlan_SP`(IN Page int, IN RecsPerPage int, IN Sort varchar(25), IN WhereClause varchar(2000), OUT RecordCount varchar(25)) BEGIN DECLARE FirstRec varchar(10); DECLARE LastRec varchar(10); DECLARE CurrYear varchar(4); DECLARE SQL1 varchar(2000); DECLARE SQL2 varchar(2000); DECLARE RecordCountMsg varchar(100);
-- Select CurrYear=curdate(YYYY);
CREATE TEMPORARY TABLE TempItems (ID int AUTO_Increment, RequestID varchar(10), `Function` varchar(250), Organization varchar(250), Company varchar(250), FirstLastName varchar(500), Year1 int, Year2 int, Year3 int, Year4 int, Year5 int, Year6 int, Year7 int, Year8 int, Year9 int, Year10 int, FTETotal int);
SET SQL1 = 'INSERT INTO TempItems (RequestID,`Function`, Organization,Company,FirstLastName, ' SET SQL1 = SQL1 + 'Year1,Year2,Year3,Year4,Year5,Year6,Year7,Year8, Year9,Year10,FTETotal) ' SET SQL1 = SQL1 + 'select distinct r.requestid, function, organization,company, ' SET SQL1 = SQL1 + 'IFNULL(CAST((select group_concat(rtrim(ww. firstlast) SEPARATOR '', '') from workforceplan_workers ww where ww.requestid = r.requestid) AS CHAR),'''') AS `FirstLastName` ' SET SQL1 = SQL1 + ',sum(CASE year WHEN ''2006'' THEN fte ELSE 0 END) as ''2006'' ' SET SQL1 = SQL1 + ' ,sum(CASE year WHEN ''2007'' THEN fte ELSE 0 END) as ''2007'' ' SET SQL1 = SQL1 + ' ,sum(CASE year WHEN ''2008'' THEN fte ELSE 0 END) as ''2008'' ' SET SQL1 = SQL1 + ' ,sum(CASE year WHEN ''2009'' THEN fte ELSE 0 END) as ''2009'' ' SET SQL1 = SQL1 + ' ,sum(CASE year WHEN ''2010'' THEN fte ELSE 0 END) as ''2010'' ' SET SQL1 = SQL1 + ' ,sum(CASE year WHEN ''2011'' THEN fte ELSE 0 END) as ''2011'' ' SET SQL1 = SQL1 + ' ,sum(CASE year WHEN ''2012'' THEN fte ELSE 0 END) as ''2012'' ' SET SQL1 = SQL1 + ' ,sum(CASE year WHEN ''2013'' THEN fte ELSE 0 END) as ''2013'' ' SET SQL1 = SQL1 + ' ,sum(CASE year WHEN ''2014'' THEN fte ELSE 0 END) as ''2014'' ' SET SQL1 = SQL1 + ' ,sum(CASE year WHEN ''2015'' THEN fte ELSE 0 END) as ''2015'' ' SET SQL1 = SQL1 + ' ,IFNULL(sum(fte),0) as ftetotal ' SET SQL1 = SQL1 + ' from workforceplan_request r left join workforceplan_fte rf ' SET SQL1 = SQL1 + ' on r.requestid = rf.requestid left join workforceplan_workers sw on sw.requestid = r.requestid ' SET SQL1 = SQL1 + ' group by r.requestid, function,organization,company ' IF WhereClause <> '' SET SQL1 = SQL1 + ' WHERE ''''='''' ' + WhereClause END IF; IF Sort <> '' SET SQL1 = SQL1 + ' Order by ' + Sort END IF;
CALL SQL1;
SET FirstRec = (Page - 1) * RecsPerPage SET LastRec = Page * RecsPerPage + 1
SET RecordCount = count(*) from TempItems SET RecordCountMsg = Page + ' pages were requested, only '
SET SQL2 = 'SELECT * FROM TempItems WHERE ID > ' + FirstRec SET SQL2 = SQL2 + 'AND ID < ' +LastRec
CALL SQL2;
END$$
DELIMITER ;
Melissa
Your problem is that you are trying to numerically add several strings together and expect a string output. The + operator is NOT used for string concatenation in MySQL. You have to use the CONCAT() function instead.
http://dev.mysql.com/doc/refman/5.0/en/string-functions.html
SET SQL1 = CONCAT(SQL1, '...');
A second pitfall is that you may need to escape certain characters within a dynamic SQL statement. I mention this now so that you can keep a watch for it later. Your built SQL statement needs to be as valid as one written by hand. I see you are already escaping your inner single quotes but you also need to be on the watch for the other special characters, too.
http://dev.mysql.com/doc/refman/5.0/en/string-syntax.html
Shawn Green Database Administrator Unimin Corporation - Spruce Pine




