写了一个存储过程,代码如下
CREATE PROCEDURE `ImportOldData`()
    NOT DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT ''
BEGIN
    DECLARE max_s_id INT;
    DECLARE max_a_id INT;
   
SELECT  max_s_id = MAX(s_id)
FROM    s_New;
SELECT  max_a_id = MAX(a_id)
FROM    a_New;    #set max_s_id = 55;    
    
 INSERT  INTO s_New
 (
  s_id,
    s_parent,
    s_name,
    p_list
)
SELECT  
s_id + max_s_id as s_id,
CASE s_parent WHEN -1 THEN -1 ELSE s_parent + max_s_id2 END as s_parent,
    s_name,
    `func_addchar`(p_list,max_s_id3) as p_list
FROM s;
        
 INSERT  INTO a_New
        (
          a_id,
          a_sort, 
          a_title
)
        SELECT  a_id + max_a_id,
                a_sort + max_s_id,
a_title
        FROM a;END;执行的时候第一个插入语句有问题,只有第一列有效,结果正确,另外2个用到变量max_s_id计算的列的值就是错误的
(其中第二列case计算的全是0,第四列函数计算的全是-1...)
而第二个插入语句没有执行.SELECT  max_s_id = MAX(s_id)
FROM    s_New;
我将这里改成
set max_s_id = 55
第一个插入语句就没问题(第二个仍是没有执行)对mysql不太熟,请大家帮忙看看什么原因
谢谢.

解决方案 »

  1.   

    mysql中执行sql语句的机制是
    先把sql语句定为一个预制语句
    然后执行,释放
    如果你写一个sql语句,里面又用到了变量等等应该这样 SET @sql = CONCAT("select * from ",@tableName,"where ",condition); PREPARE s from @sql;
    EXECUTE s;
    DEALLOCATE PREPARE s;用CONCAT把变量和字符串连接成sql语句
    然后再 PREPARE s from @sql; 预制成语句,其中s的名字是你要定制的名字,
    再用execute执行
    最后用 DEALLOCATE PREPARE 释放