MYSQL:连接 2 个包含存储函数的 select 语句时出错

标签 mysql union union-all stored-functions

下午好,

我创建了一个存储函数来模拟 MySQL 中“SHOW GRANTS FOR”命令的行为。脚本定义如下:

CREATE FUNCTION get_grants(p_user text, p_host text, p_type text, p_obj text) 
   RETURNS text 
   NOT DETERMINISTIC 
   READS SQL DATA
BEGIN
...
END;

如果我在 select 语句中使用该函数,它会正确执行。例如:

SELECT User as USER, Host as HOST, 
      'GLOBAL' as PRIV_TYPE, NULL as DATABASE_NAME,   
       mydatabase.get_grants(User, Host, 'GLOBAL', '') as PRIVILEGES
  FROM mysql.user

但是,当我使用 UNIONUNION ALL 语句连接 2 个使用不同参数值调用函数的 select 语句时,如下所示:

SELECT User as USER, Host as HOST, 
       'GLOBAL' as PRIV_TYPE, NULL as DATABASE_NAME,   
       mydatabase.get_grants(User, Host, 'GLOBAL', '') as PRIVILEGES
  FROM mysql.user
UNION ALL
SELECT User as USER, Host as HOST,
       'DB' as PRIV_TYPE, Db as DATABASE_NAME,
       mydatabase.get_grants(User, Host, 'DB', Db) as PRIVILEGES
  FROM mysql.db
 ORDER BY USER, HOST, DATABASE_NAME IS NULL, DATABASE_NAME;

我收到以下错误:#1222 - 使用的 SELECT 语句具有不同的列数

谁能解释这里发生了什么以及如何解决这个问题?

提前致谢。

最佳答案

我认为是 UNION ALL 导致了这个问题。 通常,如果您使用 UNION ALL,列数是否不同并不重要,但使用 UNION 时它们必须相等。 因此,请尝试使用 UNION ALL 并将 NULL 删除为 DATABASE_NAME 或仅使用 UNION 并将 NULL 保留为 DATABASE_NAME

SELECT User as USER, Host as HOST, 
       'GLOBAL' as PRIV_TYPE, NULL as DATABASE_NAME,   
       mydatabase.get_grants(User, Host, 'GLOBAL', '') as PRIVILEGES
  FROM mysql.user
UNION
SELECT User as USER, Host as HOST,
       'DB' as PRIV_TYPE, Db as DATABASE_NAME,
       mydatabase.get_grants(User, Host, 'DB', Db) as PRIVILEGES
  FROM mysql.db
 ORDER BY USER, HOST, DATABASE_NAME IS NULL, DATABASE_NAME;

SELECT User as USER, Host as HOST, 
       'GLOBAL' as PRIV_TYPE,   
       mydatabase.get_grants(User, Host, 'GLOBAL', '') as PRIVILEGES
  FROM mysql.user
UNION ALL
SELECT User as USER, Host as HOST,
       'DB' as PRIV_TYPE, Db as DATABASE_NAME,
       mydatabase.get_grants(User, Host, 'DB', Db) as PRIVILEGES
  FROM mysql.db
 ORDER BY USER, HOST, DATABASE_NAME IS NULL, DATABASE_NAME;

关于MYSQL:连接 2 个包含存储函数的 select 语句时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41939700/

相关文章:

sql - 在oracle sql中加入sql View

mysql - 使用大数据集模拟 MYSQL 中的完全连接

sql-server - SQL Server,对多个表使用UNION ALL然后分页实现

java - mysql jdbc连接器批量更新异常更新计数不符合预期

mysql - MYSQL where 子句中的 ifnull() 函数

php - mysql php搜索引擎查询多列

mysql请求如果不存在

mysql - 按问题联合排序

mysql - 使用选择选项从另一个数据库插入并且两个数据库表 ID 相等

mysql - 使用 DATE 子句连接或联合 5 个表