我有下面的sql脚本,我想用多查询执行它
DELIMITER $$
DROP FUNCTION IF EXISTS `getAttendanceHistoryDates`$$
CREATE FUNCTION getAttendanceHistoryDates(processDate date)
RETURNS TEXT
DETERMINISTIC
LANGUAGE SQL
BEGIN
DECLARE minDate date;
DECLARE startYear int;
DECLARE endYear int;
DECLARE dateString TEXT;
SET minDate = (SELECT MIN(date) FROM `ohrm_attendance_report`);
SET startYear = YEAR(minDate);
SET endYear = YEAR(processDate);
SET dateString = processDate;
WHILE startYear < endYear DO
SET dateString = CONCAT(dateString,'|',CONCAT(startYear, '-12-31'));
SET startYear = startYear + 1;
END WHILE;
RETURN dateString;
END;
$$
DELIMITER ;
有办法做到这一点吗?如果我只是从脚本中删除DELIMITER $$
和DELIMITER ;
,用;
替换$$
,并用多查询执行,它会起作用吗?
不,通过MySQL API是不可能的。分号分隔符不可配置。这实际上取决于MySQL服务器端。有关更多详细信息,请参阅http://dev.mysql.com/doc/refman/5.6/en/c-api-multiple-queries.html
mysql
命令行界面通过预解析输入并用分隔符分隔语句来支持DELIMITER
。然后它单独执行每个语句。
没有理由需要使用多查询。您应该将DROP FUNCTION
和CREATE FUNCTION
作为单独的查询运行。
一般来说,使用多查询是个坏主意,因为它会为糟糕的SQL注入问题创造机会。