我可以在用户定义的函数中使用子查询吗

时间:2019-01-06 05:23:03

标签: mysql sql subquery user-defined-functions

我尝试在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 个答案:

答案 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