最近项目要从oracle迁移到mysql,遇到这样个问题直接上代码
oracle中是这样写的:
    TEMP_NAME := 'call  ' || VC_NAME || '(:1,:2,:3,:4)';
    EXECUTE IMMEDIATE TEMP_NAME
      USING IN VC_PARAM, OUT CLOB_VC_RESDATA, OUT vc_flag, OUT vc_message;在MYSQL中应该如何实现?set @strsql = CONCAT("call ",VC_NAME,"('",VC_PARAM,"',@CLOB_VC_RESDATA,@vc_flag,@vc_message)");vc_name :过程名
第一个参数是传入参数
剩下的是返回参数.
求助: 如何能正确执行?例如:
set @strsql = "update table set name='123' where id=1";
select @strsql;
PREPARE stmt FROM @strsql;
EXECUTE stmt;如何能像执行SQL语句一样执行上面那个拼接的过程?MySQL存储过程执行动态过程

解决方案 »

  1.   

    set @strsql = CONCAT("call ",VC_NAME,"('",VC_PARAM,"',@CLOB_VC_RESDATA,@vc_flag,@vc_message)");@strsql中的内容是什么,有什么问题,提示什么
      

  2.   

    mysql 什么版本?
    5.5下
    SET @asql=CONCAT('call dd');
    PREPARE stml FROM @asql;
    EXECUTE stml
    测试没有问题
      

  3.   


    楼主目前用 prepare 来调用 call出现的问题是什么? 如果有错误提示请一同贴出以供分析。
      

  4.   

    回复wwwwb:
    MYSQL版本是5.5谢谢,我刚才自己解决了.
    奇怪了,我上午就是这么写的.折腾了一上午都不行.
    为什么现在突然就行了呢.
    我没改任何东西啊.
    但还是谢谢你. 顺便问你个问题:
    DEALLOCATE PREPARE stmt;
    这句话是什么意思?
    是释放stmt么?写和不写这句话有什么区别?
      

  5.   

    回复ACMAIN_CHM:
    谢谢你,问题已经解决了.
            /* START Declare Exception Handlers */ 
    DECLARE EXIT HANDLER FOR SQLWARNING,SQLEXCEPTION
    BEGIN
    SET vc_flag='-1';
    SET vc_message='发生错误,请联系系统管理员!';
    END;
    /* END Declare Exception Handlers */所有的过程都这样捕捉异常,可以吗?谢谢
      

  6.   

    预制语句的SQL语法基于三个SQL语句:
     PREPARE stmt_name FROM preparable_stmt;
      
     EXECUTE stmt_name [USING @var_name [, @var_name] ...];
      
     {DEALLOCATE | DROP} PREPARE stmt_name; PREPARE语句用于预备一个语句,并赋予它名称stmt_name,借此在以后引用该语句。语句名称对案例不敏感。preparable_stmt可以是一个文字字符串,也可以是一个包含了语句文本的用户变量。该文本必须展现一个单一的SQL语句,而不是多个语句。使用本语句,‘?’字符可以被用于制作参数,以指示当您执行查询时,数据值在哪里与查询结合在一起。‘?’字符不应加引号,即使您想要把它们与字符串值结合在一起,也不要加引号。参数制作符只能被用于数据值应该出现的地方,不用于SQL关键词和标识符等。
     如果带有此名称的预制语句已经存在,则在新的语言被预备以前,它会被隐含地解除分配。这意味着,如果新语句包含一个错误并且不能被预备,则会返回一个错误,并且不存在带有给定名称语句。 预制语句的范围是客户端会话。在此会话内,语句被创建。其它客户端看不到它。 在预备了一个语句后,您可使用一个EXECUTE语句(该语句引用了预制语句名称)来执行它。如果预制语句包含任何参数制造符,则您必须提供一个列举了用户变量(其中包含要与参数结合的值)的USING子句。参数值只能有用户变量提供,USING子句必须准确地指明用户变量。用户变量的数目与语句中的参数制造符的数量一样多。 您可以多次执行一个给定的预制语句,在每次执行前,把不同的变量传递给它,或把变量设置为不同的值。 要对一个预制语句解除分配,需使用DEALLOCATE PREPARE语句。尝试在解除分配后执行一个预制语句会导致错误。