PREPARE Stmt在存储过程中给出语法错误

时间:2016-08-25 10:58:13

标签: mysql stored-procedures mysql-workbench

我不明白我做错了什么。

我在SQL Server中有一个存储过程,我需要迁移到MySQL。

当我运行我打印的相同查询时,但是同一个变量无法生成prepare语句,导致语法错误。

  

错误代码:1064您的SQL语法出错;检查   手册,对应右边的MySQL服务器版本   要在'附近使用的语法(如果存在)(select * from   INFORMATION_SCHEMA.TABLES其中table_name ='bkup2_t_amt '在第1行

DELIMITER //
DROP PROCEDURE IF EXISTS pull_amts_from_PS;

CREATE  Procedure pull_amts_from_PS ( p_PSEnv VARCHAR(50))
BEGIN
    DECLARE v_cmd NVARCHAR (3500);
    #-- --------------  backup previous amts records
    DECLARE v_seq int;
    DECLARE v_iterations int;

    SET v_iterations = 10;

    SELECT info_fieldval_int into @seq from t_lrdb_general_info WHERE info_fieldname = 'amts_backup_sequence_no' ;
    select concat('SEQ #: ',@seq) ;

    select concat(concat('bkup',@seq),'_t_amts_input') into @v_cmdTemp;
    select concat('v_cmdTemp #: ',@v_cmdTemp) ;


    set @seq=concat("select * from INFORMATION_SCHEMA.TABLES where table_name='",@v_cmdTemp,"' and table_type='BASE TABLE'");



    select concat('SEQ 1 #: ',@seq) ;

    set @v_cmdTemp1=concat(  "if exists (", @seq ,") THEN  DROP TABLE ", @v_cmdTemp ," ; END IF;");

   select concat('v_cmdTemp1 1 #: ',@v_cmdTemp1) ;


    PREPARE stmt FROM @v_cmdTemp1;
    EXECUTE stmt ;
    DEALLOCATE PREPARE stmt ;

END;
//
DELIMITER ;

输出: -

SEQ #: 2

v_cmdTemp #: bkup2_t_amts_input

SEQ 1 #: select * from INFORMATION_SCHEMA.TABLES where table_name='bkup2_t_amts_input' and table_type='BASE TABLE'

v_cmdTemp1 1 #: if exists (select * from INFORMATION_SCHEMA.TABLES where table_name='bkup2_t_amts_input' and table_type='BASE TABLE') THEN  DROP TABLE bkup2_t_amts_input ; END IF;

v_cmdTemp1的最后一个值,当执行它工作正常时,但是执行变量它不起作用。

1 个答案:

答案 0 :(得分:0)

if exists是MySQL的修正案,不是主要命令,因此你不能写:

if exists drop table a;

而是使用表格:

drop table if exists a;

或多个表:

drop tables if exists a, b, c;

您不需要从I_S获取任何内容用于放置操作。你知道桌子的名字,所以就放下它。