2

フィールドが空であるかどうかをチェックして1つのクエリを実行することになっているこのストアドプロシージャがあります。そうでない場合は、別のクエリを実行しますが、エラーが発生します。コードは次のとおりです。

DELIMITER $$
 CREATE PROCEDURE mw_info(
    m_date_begin INTEGER,
    m_date_end INTEGER,
    m_from INTEGER,
    m_numberOfrecords INTEGER,
    m_callsource VARCHAR(15))
 BEGIN

    IF (m_callsource = '') THEN

       SELECT * 
         FROM mw_iaa 
        WHERE calllegcode IN ('CB_A','CB_B')
          AND calltime BETWEEN m_date_begin AND m_date_end
        ORDER BY calltime DESC 
        LIMIT m_from, m_numberOfrecords;

    ELSE     

       SELECT * 
         FROM mw_iaa 
        WHERE calllegcode IN ( 'CB_A', 'CB_B')
          AND callsource = m_callsource
          AND calltime BETWEEN m_date_begin AND m_date_end
        ORDER BY calltime DESC 
        LIMIT m_from, m_numberOfrecords;    

    END IF; 

 END;  
 END$$
DELIMITER ;

そしてこれはエラーです:

エラーコード:1064SQL構文にエラーがあります。
1行目の「elseSELECT*FROM mw_iaa WHERE calllegcode」の近くで使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください。

問題は何でしょうか?

4

2 に答える 2

2

これは 1 つのクエリでのみ実行でき、次のIFようにステートメントを削除できます。

SELECT * 
FROM mw_iaa
WHERE ((m_callsource = '') OR (callsource = m_callsource))
  AND calllegcode IN ('CB_A', 'CB_B')
  AND callsource = m_callsource
  AND calltime BETWEEN m_date_begin AND m_date_end
ORDER BY calltime DESC 
LIMIT m_from, m_numberOfrecords;

m_callsource次に、でパラメータを渡すたび''に、条件((m_callsource = '') OR (callsource = m_callsource))は提示されていないため無視されます。

于 2012-12-23T14:14:56.893 に答える
0

このようなエラーを見たことがありますが、プロシージャ ソースにタブ文字が含まれていました。

すべてのタブ文字をスペースに置き換えてみてください。

于 2012-12-23T14:14:16.560 に答える