mysql 存储过程嵌套调用,在调用者中对被调用者返回的记录集进行处理,问题是如何再调用者中获得被调用者的记录集呢?临时表会不会速度太慢呢?

解决方案 »

  1.   

    在MYSQL中只有用临时表的方法来处理,如果记录不多,速度不会太慢
      

  2.   

    通过存储过程再调用存储过程,没有办法直接返回记录集或游标。只能通过临时表。具体速度没有测试过,MyIASM理论上速度不会太慢。但要看具体情况。
      

  3.   

    没关系,临时表是session 级的。也就是仅在一个连接内可见。不同连接进去创建的临时表是不会相互影响的。当连接断开时,这个临时表也就被自动删除了。
      

  4.   

    我需要在每次调用中都删除临时表吗?
    被调用者SA
    CREATE PROCEDURE SA()
    BEGIN
           SELECT * FROM TEST_TABLE  LIMIT ?,?//返回100条记录
    END;调用者SW
    CREATE PROCEDURE SW()
    BEGIN 
         CREATE TABLE #TMP(字段列表)
         INSERT INTO #TMP EXEC SA()
         SELECT FROM #TMP LEFT JOIN TEST_TABLE_A
         DROP TABLE #TMP
    END;
    以上过程是不是可以再优化呢?
         
      

  5.   

    你用的WEB调用,所以每次都会产生一个新的connection. 所有没关系。直接用就可以了。不会互相干扰的。除非你在一个联接内要调两次这个存储过程。如果这样的话,你应该在存储过程的最后返回时drop 掉这个表
      

  6.   

    不删除就要TRUNCATE,删除要快一些将参数带上
    CREATE TABLE #TMP(字段列表)
        as SELECT * FROM TEST_TABLE  LIMI cs1,cs2
    一个SP就可以解决了嘛 
      

  7.   

     CREATE TABLE #TMP 你这不是临时表啊。CREATE TEMPORARY TABLE #TMP
      

  8.   

    临时表相对于工作表而言,用
    CREATE TABLE #TMP 
    OR
    CREATE TEMPORARY TABLE #TMP
    均可
      

  9.   

    CREATE TABLE #TMP 产生的普通表,会有不同connection相互之间的冲突问题。比如你的网页被同一用户多次刷新。用临时表则比较简单。你的代码可以直接。CREATE PROCEDURE SW()
    BEGIN 
    CREATE TEMPORARY TABLE IF NOT EXISTS  #TMP LIKE old_tbl_name TEST_TABLE ;
    INSERT INTO  #TMP EXEC SA()
    END;
      

  10.   

    DELIMITER $$CREATE PROCEDURE SW(in cs1 int,in cs2 int)
    BEGIN
        DROP TEMPORARy TABLE IF EXISTS TMP;
    set @ff=concat('CREATE TEMPORARy TABLE TMP',
         ' as SELECT * FROM TEST_TABLE LIMIt ',cs1,',',cs2);
    select @ff;
    prepare dd from @ff;
    execute dd;
            SELECT * FROM TMP a LEFT JOIN TEST_TABLE_A b on a.id=b.id;
        DROP TEMPORARy TABLE TMP;
         END$$DELIMITER ;
      

  11.   

    我的不是WEB调用,而是GUI程序。
    还有,调用在存储过程中调用存储过程是用EXEC吗?MYSQL数据库。
    另外,的确是在一个连接内的多次循环调用的。
      

  12.   

    还有,调用在存储过程中调用存储过程是用EXEC吗?
    NO,CALL 存储过程
      

  13.   

    GUI程序 CS结构,这样的话,由于临时表不会被自动删除。建议你在你的存储过程执行完后,truncate或delete掉所有的记录。或在你的程序中删除。你的具体需求是什么?仅从你的例子中的情况看似乎根本不需要这么复杂。