我尝试在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变量数不正确
答案 0 :(得分:0)
错误消息:错误代码: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
表示需要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
。