在MYSQL存储过程中使用CTE(WITH)

在MYSQL存储过程中使用CTE(WITH),mysql,Mysql,我试图使用CTE运行下面的查询,以避免MySQL存储过程中出现“无法重新打开表xxxx”错误。MySQL Workbench声称存在语法错误,不允许保存该过程。带有红色下划线,内容如下 With对此服务器版本8.0.13的此位置无效,应为:缓存、校验和、提交 即使您尝试使用独立代码,也会出现此错误-您需要一种不同的方法。文件中允许使用WITH条款:。。。。。在包括派生表子查询在内的子查询开始时,我也尝试过,但没有成功。这是一个bug吗?我通过使用一个临时表解决了这个问题,但是如果能弄清楚为什么C

我试图使用CTE运行下面的查询,以避免MySQL存储过程中出现“无法重新打开表xxxx”错误。MySQL Workbench声称存在语法错误,不允许保存该过程。带有红色下划线,内容如下

With对此服务器版本8.0.13的此位置无效,应为:缓存、校验和、提交


即使您尝试使用独立代码,也会出现此错误-您需要一种不同的方法。文件中允许使用WITH条款:。。。。。在包括派生表子查询在内的子查询开始时,我也尝试过,但没有成功。这是一个bug吗?我通过使用一个临时表解决了这个问题,但是如果能弄清楚为什么CTE不能在存储过程中工作,或者可能不能在MYSQL中工作,那就好了Workbench@Erick我有一个SP正在子查询中与CTE一起工作,但我正在排除故障的SP现在有一个插入到。。。。具有选择语法,它就不起作用了。我还尝试将CTE放入子查询中,如插入到。。。使用…,从中选择*,还是不行。它运行的查询在SP外部不到一秒钟内执行。我已经调试了几个小时了,现在不知所措。有什么想法吗?SP总是停留在统计上。我排除了CTE的错误-插入tbl col1、col2。。。cte为选择123456。。。从cte中选择*这在SP中工作。
        ELSE
            -- Board charges
            WITH cte AS (SELECT id FROM billablehorses)
            INSERT INTO billablehorses 
            (id, horse, agrid, dos, months, installment, totalamount, billed, payableid)
            SELECT ah.id, h.name, a.id, ah.dos, 
            TIMESTAMPDIFF(MONTH, ah.dos, b.boardingdate) Months,
            p.amount,
            a.totalamount,
            TRUE,
            p.id
            FROM horses h 
            INNER JOIN agreementhorses ah
            ON h.id = ah.horseid
            INNER JOIN agreements a 
            ON ah.agreementid = a.id
            INNER JOIN payables p
            ON ah.id = p.agreementhorseid
            INNER JOIN boarding b
            ON p.ticketid = b.id
            WHERE p.typeid = 1
            AND ah.id IN (SELECT id FROM cte)
            AND EXISTS (SELECT id FROM billed WHERE id = ah.id);
            SET msg = CONCAT(ROW_COUNT() , " ", 'board charges inserted');
        END IF;