php - 如何使用 mysqli 多查询执行自定义分隔符查询

标签 php mysql mysqli-multi-query

我有下面的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 FUNCTIONCREATE FUNCTION 作为单独的查询运行。

使用多查询通常不是一个好主意,因为它为 bad SQL injection problems 创造了机会.

关于php - 如何使用 mysqli 多查询执行自定义分隔符查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23004895/

相关文章:

php - multi_query 不在循环内运行

php - Symfony 和 Doctrine 中对数据库的查询过多

php - 防止从php输入时mysql数据库中的数据重复

PHP 根据其他表的 ID 查询 MySQL 表

mysql - 极慢的 SQL 选择查询

php - 如何使用mysqli->multi_query()?

php - 查询 m-d-Y 时显示 SQL 结果中的年份

php - 将连接结果映射为相关行下的数组

php - 可以在不重新加载页面的情况下更改 sql 排序顺序吗?

php - mysqli_multi_query 未插入到 mysql 数据库