Mysql存储过程:无法重新打开表:'临时表'。如何解决这个问题

时间:2015-11-15 13:34:54

标签: mysql stored-procedures

当我调用存储过程时,我成功执行了此过程,收到错误消息:

  

无法重新打开表:'temp1'。

它就像在查询中多次使用临时表一样。任何想法或其他解决方案来解决这个问题?

DELIMITER //
CREATE PROCEDURE menu_t1()
BEGIN
CREATE TEMPORARY TABLE if not exists temp1(
    object_id VARCHAR(50) NULL, 
    description VARCHAR(100) NULL,
    display_name VARCHAR(60) NULL,
    menu_id VARCHAR(40) NULL,
    order_seq int NULL,
    menu_level int NULL,
    link_url VARCHAR(200) NULL,
    OrderString VARCHAR(200) NULL
    );

    insert into temp1 (object_id, description, display_name, menu_id, order_seq, menu_level, link_url, OrderString)
    SELECT mp.object_id, mp.description, mp.display_name, mp.menu_id, mp.order_seq, mp.menu_level, mp.link_url,
    concat('00',cast((mp.order_seq) as char)) OrderString 
    FROM ui_menuitem mp 
    WHERE mp.parent_id is null and mp.menu_id = '1';

    select * from temp1;

   select * from temp1
   union all
   select mc.object_id, mc.description, mc.display_name, mc.menu_id, mc.order_seq, mc.menu_level, mc.link_url, 
    concat(temp1.OrderString,'-',cast((mc.order_seq) as char)) OrderString
    from ui_menuitem mc, temp1
    where mc.parent_id = temp1.object_id and mc.menu_id = '1';

    TRUNCATE TABLE temp1;
   DROP TEMPORARY TABLE IF EXISTS temp1;

COMMIT;
END //
DELIMITER ;

这种风格看起来像递归。

谢谢

1 个答案:

答案 0 :(得分:0)

虽然您已声明临时表,但您尚未对其进行任何定义,例如列,类型,也未向其中插入任何数据。您所做的就是声明它,然后执行select语句。

您需要通过执行此类操作来定义您的表

CREATE TABLE #temp1(
    object_id INT, 
    description VARCHAR(200)
    ...)

然后将数据插入其中

INSERT INTO #temp1(object_id, description, ...)
SELECT mp.object_id, mp.description, ...

您目前收到错误,因为temp1目前没有OrderString列。