我可以在用户定义的函数中使用子查询吗
Posted
技术标签:
【中文标题】我可以在用户定义的函数中使用子查询吗【英文标题】:Can I use subquery in a user-defined function 【发布时间】:2019-01-06 05:23:03 【问题描述】:我尝试在 mysql 自定义用户定义函数中使用子查询我得到一个错误所以你能帮我举一个例子吗? 这是我的代码:
CREATE DEFINER=`root`@`localhost` FUNCTION `findsubName`(counts INT)
RETURNS varchar(255) CHARSET utf8
BEGIN
DECLARE result VARCHAR(500) DEFAULT NULL;
DECLARE v_name VARCHAR(200);
DECLARE finished INT(1) DEFAULT 0;
DECLARE my_cursor CURSOR FOR
SELECT id, (SELECT t_name FROM ajctb_titles b WHERE a.jt_id=b.t_id)
as tableName FROM ajctb_vacancies a limit counts;
DECLARE CONTINUE HANDLER
FOR NOT FOUND
SET finished = 1;
OPEN my_cursor;
calc_change: LOOP
FETCH my_cursor INTO v_name;
IF finished THEN
LEAVE calc_change;
END IF;
IF result<>'' THEN
SET result = CONCAT_WS(',',result,v_name);
ELSE
SET result = v_name;
END IF;
END LOOP calc_change;
CLOSE my_cursor;
RETURN result;
END
错误信息: 错误代码:1328。FETCH 变量数不正确
【问题讨论】:
【参考方案1】:错误信息:错误代码:1328。FETCH 变量的数量不正确
错误消息试图告诉您问题所在。它在 FETCH 中。查看文档:
13.6.6.3 游标 FETCH 语法
FETCH [[NEXT] FROM] cursor_name INTO var_name [, var_name] ...
此语句获取下一行 与指定游标关联的 SELECT 语句(必须是 打开),并前进光标指针。如果存在一行,则提取的 列存储在命名变量中。 列数 SELECT语句检索到的输出数必须匹配 FETCH 语句中指定的变量。 https://dev.mysql.com/doc/refman/8.0/en/fetch.html
您的查询中有 2 列:
SELECT
id
, (
SELECT
t_name
FROM ajctb_titles b
WHERE a.jt_id = b.t_id
)
AS tableName
表示 FETCH 需要 2 个变量
它甚至还没有尝试子查询。
关于相关子查询,这可能是个问题。当您在这样的 select 子句中使用子查询时,它必须返回不超过一个值。因此,如果您继续该子查询,您应该使用 limit 1
。
该子查询可以替换为连接。例如
SELECT
id
, b.t_name AS tableName
FROM ajctb_vacancies a
LEFT JOIN ajctb_titles b ON a.jt_id = b.t_id
如果您必须始终返回一个非空表名,您可能需要使用INNER JOIN
。
【讨论】:
以上是关于我可以在用户定义的函数中使用子查询吗的主要内容,如果未能解决你的问题,请参考以下文章