【问题标题】:PREPARE Stmt giving syntax Error in stored procedurePREPARE Stmt 在存储过程中给出语法错误
【发布时间】:2017-01-01 18:39:17
【问题描述】:

我不明白我做错了什么。

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

当我运行我打印的相同查询时,我正在运行,但相同的变量无法生成准备语句,导致语法错误。

错误代码:1064 您的 SQL 语法有错误;检查 与您的 MySQL 服务器版本相对应的手册 'if 存在附近使用的语法(select * from INFORMATION_SCHEMA.TABLES where 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 的最后一个值,执行时可以正常工作,但使用变量执行时就不行了。

【问题讨论】:

    标签: mysql stored-procedures mysql-workbench


    【解决方案1】:

    if exists 是 MySQL 中的一个修正,而不是主要命令,因此你不能写:

    if exists drop table a;
    

    改为使用以下形式:

    drop table if exists a;
    

    或者对于多个表:

    drop tables if exists a, b, c;
    

    你不需要从 I_S 获取任何东西来进行放置操作。您知道表的名称,所以只需删除它。

    【讨论】:

    • 谢谢 Mike,我已经添加了一些逻辑。
    • SET @v_query_exist_table=concat("SELECT count(*) from INFORMATION_SCHEMA.TABLES where table_name='",@v_cmdTemp,"' and table_type='BASE TABLE' into @v_table_exists_count");从 @v_query_exist_table 准备 stmt;执行 stmt ; DEALLOCATE PREPARE stmt; SELECT concat('SEQ 1 #: ',@v_table_exists_count);
    • IF (@v_table_exists_count=0) THEN SELECT concat('SEQ 1 #: ',@v_table_exists_count); else SELECT concat("DROP TABLE ", @v_cmdTemp ," ;") into @v_cmdTemp1; SELECT concat('v_cmdTemp1 1 #: ',@v_cmdTemp1);准备来自@v_cmdTemp1的stmt;执行 stmt ; DEALLOCATE PREPARE stmt;如果结束;
    猜你喜欢
    • 2019-02-02
    • 2020-10-15
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    • 2018-05-12
    • 2018-04-06
    • 2013-06-12
    相关资源
    最近更新 更多