1

私は以下のようなテーブルと行をテーブルに持っています

CREATE TABLE Areas(AreaName VARCHAR(255),
                    PinCode VARCHAR(255))

INSERT INTO Areas(AreaName, PinCode)
      VALUES('Teynampet', '6000018'), 
            ('Ramapuram', '6000089'),
            ('TNagar', '6000017'), 
            ('Mylapore', '6000014'), 
            ('Gopalapuram', '6000087')

SQLプロシージャを次のように記述しました

DROP PROCEDURE IF EXISTS mp_test;
CREATE PROCEDURE mp_test(IN pArea VARCHAR(255))
   BEGIN
      SET @Query = 'SELECT PinCode FROM Areas';

      IF pArea != ''
      THEN
         SET @City = CONCAT(' WHERE AreaName = ', pArea);
      END IF;

      SET @Query = CONCAT(@Query, @City);

 PREPARE stmt FROM @Query;
 EXECUTE stmt;
END 

プロシージャを呼び出すとき

CALL mp_test('Teynampet');

実行すると、目的の結果が得られません。つまり、600018です。

SPで動的にクエリを作成するにはどうすればよいですか

助けてくれてありがとう

4

1 に答える 1

2

pAreaパラメータを引用符で囲まれていないSQLに連結しています。つまり、@Query実行のために準備する内容は次のとおりです。

SELECT PinCode FROM Areas WHERE AreaName = Teynampet

は引用符で囲まれていないためTeynampet、文字列ではなく (不明な) SQL 識別子として解析されます。次のいずれかを行う必要があります。

  • あなたのSQLでそれを引用してください:

    SET @City  = CONCAT(' WHERE AreaName = ', QUOTE(pArea));
    
  • それを準備済みステートメントにパラメーターとして渡します。

    SET @City  = CONCAT(' WHERE AreaName = ?');
    SET @param = pArea;
    

    その後:

    EXECUTE stmt USING @param;
    

しかし、なぜここで準備済みステートメントを使用するのでしょうか。プロシージャは単純に書き直すことができますSELECT(ストアド プロシージャを使用する必要があるかどうかという疑問が生じます)。

CREATE PROCEDURE mp_test(IN pArea VARCHAR(255))
  SELECT PinCode FROM Areas WHERE pArea IN (AreaName, '');

NULL(空の文字列の代わりに使用することをお勧めします。''この場合、上記のテストは になりますpArea IS NULL OR pArea = AreaName)。

于 2012-08-29T09:25:17.557 に答える