-1

動的クエリを作成したいので、MySQL ストア プロシージャを作成しようとしました。私が取り組んでいるコード..

DELIMITER $$

DROP PROCEDURE IF EXISTS `test`.`selectp` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `selectp`(in a_str_Condition varchar(500))

BEGIN
 SET @Query = 'SELECT * from test123';
IF a_str_Condition != ''
THEN
   SET @strCondition = CONCAT(' WHERE ? ');
   SET @param = a_str_Condition;
ELSE
 SET @strCondition = ' Order by aaa desc';
END IF

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

    PREPARE stmt FROM @Query;
    EXECUTE stmt USING @param;
    DEALLOCATE PREPARE stmt;

END $$

DELIMITER ;

ここで、パラメーターを as として渡しaaa = 3、それを mysql クエリと連結したいのですが、以下のようなエラーが表示されます。

ここに画像の説明を入力

このストア手順について明確にしてください。どんな助けでも感謝します。

4

3 に答える 3

1

あなたに答えようとしています...MySQL選択ストアプロシージャの何が問題なのですか..?

他の人が言ったように、あなたは;行方不明です。それは構文エラーを解決するだけです。
しかし、クエリを構築しようとする方法には、より大きな問題がありますEXECUTE

  1. WHERE ?のような値をパラメータ化するのではなく、すべての where 条件を で 1 つのパラメータとして誤って処理しようとしています。WHERE id = ?
  2. USINGで使用できない条件を渡さない場合EXECUTE。失敗します。

クエリを複数回実行しないので、とにかく条件を文字列として渡します。セキュリティよりも柔軟性を求めているようです。私見では、ここでパラメーターを使用する意味はあまりありません。

つまり、SP のより簡潔なバージョンは次のようになります。

DELIMITER $$
CREATE PROCEDURE selectp(IN _conditions VARCHAR(500), IN _orderby VARCHAR(500))
BEGIN
  SET @sql = CONCAT(
    'SELECT * FROM test123 WHERE 1 = 1',
    COALESCE(CONCAT(' AND ', NULLIF(_conditions, '')), ''),
    ' ORDER BY ',
    COALESCE(NULLIF(_orderby, ''), 'id DESC')
    );
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END$$
DELIMITER ;

使用例:

-- default parameters either with null or an empty string
CALL selectp('', '');
CALL selectp(NULL, NULL);
-- set where conditions
CALL selectp('id IN(1, 3)', NULL);
-- set order by
CALL selectp(NULL, 'col1 DESC, col2');

これがSQLFiddleのデモです

于 2013-08-06T05:26:58.793 に答える
1

の後にセミコロンがありませんEND IF

そして、それが mysql が指し示しているものです。解析できなかった式の部分が常に表示されます。そのため、エラーの説明にあるコードの直前のコードを常に見てください。

于 2013-08-06T04:38:48.200 に答える
1

END IF ステートメントの後に半列が必要です。

ELSE
 SET @strCondition = ' Order by aaa desc';
END IF; //add semicolumn here

この行の前:

SET @Query = CONCAT(@Query, @strCondition );
于 2013-08-06T04:38:53.807 に答える