CREATE DEFINER=`root`@`%` PROCEDURE `simpleproc`(
  IN USER_ID INT,
  IN STEP INT,  
  INOUT CPIC_ID INT,
  OUT FILENAME INT  
  )
BEGIN 
  SET @TYPER = CONCAT('Typer', STEP);    
  SET @STATE = CONCAT('State', STEP);        set @sql=concat('update ', @t, ' set ', 
    @typer, '=', USER_ID, ',', @state, '=1 where pic_id>=', CPIC_ID, 
    ' and ', @STATE, '=0 LIMIT 1;');         
  PREPARE stmt1 FROM @sql;
  EXECUTE stmt1;
  DEALLOCATE PREPARE stmt1; 
    
    
  SET @SQL = CONCAT('SELECT PIC_ID, PICNAME FROM STATE WHERE ',  
    @typer, '=', USER_ID, ' AND ', @state, '=1 LIMIT 1 INTO CPIC_ID, FILENAME');
    
  PREPARE stmt2 FROM @sql;
  EXECUTE stmt2;
  DEALLOCATE PREPARE stmt2;  
      
END;

解决方案 »

  1.   

     SET @W=1;
     call `simpleproc` (1234, 2, @W, @q);  @SQL 的一个结果是:update STATE set Typer2=1234,State2=1 where pic_id>=1 and State2=0 LIMIT 1;单独执行没有问题
      

  2.   

    无法编译保存,去掉PREPARE stmt1 FROM @sql;
      EXECUTE stmt1;
      DEALLOCATE PREPARE stmt1; 就没有问题。
      

  3.   

    sql 执行错误 #1064。 从数据库的响应:You have an error in your sql syntax: check the menual that corresponds to your MySQL server version for the right syntax to uses near 'null' at line 1
      

  4.   

    你顶楼中的代码根本没有 null 这个单词啊!You have an error in your sql syntax: check the menual that corresponds to your MySQL server version for the right syntax to uses near 'null' at line 1你能确认你执行的是顶楼的代码吗?
      

  5.   

    确认。谁说不是呀!我的代码里就没有写 null。不过提示是大写的 “NULL”。  
      

  6.   

    set @sql=concat('update ', @t, ' set ',  
      @typer, '=', USER_ID, ',', @state, '=1 where pic_id>=', CPIC_ID,  
      ' and ', @STATE, '=0 LIMIT 1;');   我已经将 这里的  @t 已经改为 实际表名 “STATE” 。  set @sql=concat('update STATE set ', 
        @typer, '=', USER_ID, ',', @state, '=1 where pic_id>=', CPIC_ID, 
        ' and ', @STATE, '=0 LIMIT 1;');      将: 
      PREPARE stmt1 FROM @sql;
      EXECUTE stmt1;
      DEALLOCATE PREPARE stmt1;   替换为: 
       SELECT @SQL;可以编译保存,执行结果发现 sql 语句是正确的。
    测试代码: SET @W=1;
     call `simpleproc` (1234, 2, @W, @q);   @SQL 的结果是:update STATE set Typer2=1234,State2=1 where pic_id>=1 and State2=0 LIMIT 1;
      

  7.   

     这里定义的是@STATE,大写,用的时候是@state,小写。
    在WINDOWS下不分大小写没问题,LINUX下没有@state定义。
      

  8.   

    用你顶楼的代码测试,显然没有问题,创建成功·! 如果你的还不行,就请如下一样贴出你完整的操作。mysql> delimiter //
    mysql> CREATE PROCEDURE `simpleproc`(
        ->  IN USER_ID INT,
        ->  IN STEP INT,
        ->  INOUT CPIC_ID INT,
        ->  OUT FILENAME INT
        ->  )
        -> BEGIN
        ->  SET @TYPER = CONCAT('Typer', STEP);
        ->  SET @STATE = CONCAT('State', STEP);
        ->
        ->  set @sql=concat('update ', @t, ' set ',
        ->    @typer, '=', USER_ID, ',', @state, '=1 where pic_id>=', CPIC_ID,
        ->    ' and ', @STATE, '=0 LIMIT 1;');
        ->
        ->
        ->  PREPARE stmt1 FROM @sql;
        ->  EXECUTE stmt1;
        ->  DEALLOCATE PREPARE stmt1;
        ->
        ->
        ->  SET @SQL = CONCAT('SELECT PIC_ID, PICNAME FROM STATE WHERE ',
        ->    @typer, '=', USER_ID, ' AND ', @state, '=1 LIMIT 1 INTO CPIC_ID, FILEN
    AME');
        ->
        ->  PREPARE stmt2 FROM @sql;
        ->  EXECUTE stmt2;
        ->  DEALLOCATE PREPARE stmt2;
        ->
        -> END;
        ->
        -> //
    Query OK, 0 rows affected (0.13 sec)mysql> delimiter ;
    mysql>
      

  9.   

    多谢 ACMAIN_CHM 及 zuoxingyu 的热心帮助 !现在已经正确保存。