2016-08-25 57 views
0

我不明白我做錯了什麼。準備給語法存儲過程中的錯誤

我在SQL Server中有一個存儲過程,我需要遷移到MySQL。

當我運行相同的查詢,我打印的工作,但同一個變量不能夠使準備語句,導致語法錯誤。

錯誤代碼:1064您的SQL語法錯誤;檢查對應於你的MySQL服務器版本的權利 語法使用附近的 手冊 '是否存在(SELECT * FROM INFORMATION_SCHEMA.TABLES在表格名=' 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 ; 

bkup2_t_amt「輸出: -

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的值,當執行它做工精細,但具有可變執行它不起作用

回答

0

if exists是在MySQL,而不是一個主命令的ammendment,因此也可以不寫:

if exists drop table a; 

而是使用以下形式:

drop table if exists a; 

或多個表:

drop tables if exists a, b, c; 

您不需要從I_S獲取任何用於放置操作的任何內容。你知道表的名字,所以就把它放下。

+0

感謝邁克,我已經完成了增加一些邏輯。 –

+0

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; EXECUTE stmt; DEALLOCATE PREPARE stmt; SELECT concat('SEQ 1#:',@ v_table_exists_count); –

+0

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; EXECUTE stmt; DEALLOCATE PREPARE stmt; END IF; –