为何我的 alter procedure 无法成功呢?官方文档明写着,有 alter procedure 这种语法呀?delimiter //
alter procedure prog2(in v1 int,out v2 decimal(18,2))
begin
select 20 into v1; 
select f2
into v2
from tb1
limit 1 offset 0;
end
//
delimiter ;

解决方案 »

  1.   

    同样的语句,create成功,但是 alter 就是报错,我不知错在哪里。我上官方网站上看说明,明写着支持 alter procedure 语法呀?
      

  2.   

    20.2.2. ALTER PROCEDURE和ALTER FUNCTION
    ALTER {PROCEDURE | FUNCTION} sp_name [characteristic ...]
     
    characteristic:
        { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
      | SQL SECURITY { DEFINER | INVOKER }
      | COMMENT 'string'
    这个语句可以被用来改变一个存储程序或函数的特征。在MySQL 5.1中,你必须用ALTER ROUTINE权限才可用此子程序。这个权限被自动授予子程序的创建者。如20.4节,“存储子程序和触发程序的二进制日志功能”中所述, 如果二进制日志功能被允许了,你可能也需要SUPER权限。在ALTER PROCEDURE和ALTER FUNCTION语句中,可以指定超过一个的改变。20.2.3. DROP PROCEDURE和DROP FUNCTION
    DROP {PROCEDURE | FUNCTION} [IF EXISTS] sp_name
    这个语句被用来移除一个存储程序或函数。即,从服务器移除一个制定的子程序。在MySQL 5.1中,你必须有ALTER ROUTINE权限才可用此子程序。这个权限被自动授予子程序的创建者。IF EXISTS 子句是一个MySQL的扩展。如果程序或函数不存储,它防止发生错误。产生一个可以用SHOW WARNINGS查看的警告。
      

  3.   

    http://dev.mysql.com/doc/refman/5.1/zh/stored-procedures.html#alter-procedure
      

  4.   

    很好,可惜的是你没看懂。这个说明中根本就没提routine_body仔细和下面的语法对比一下,看看有什么差别。
    CREATE
        [DEFINER = { user | CURRENT_USER }]
        PROCEDURE sp_name ([proc_parameter[,...]])
        [characteristic ...] routine_body
      

  5.   

    谢指教,好象是没有过程体是吧?
    那这个 alter procedure 的作用是什么,请再指教,谢谢老师。
      

  6.   


    上面不是写得很清楚吗?什么东西能通过ALTER {PROCEDURE修改。