12

保存されたプロシージャを作成しました。さまざまなパラメータでデータをフィルタリングしたい。1つのパラメーターを渡す場合、それは1つでフィルター処理する必要があります。2つ渡すと、2つでフィルタリングされるはずですが、機能しません。

誰か助けてくれませんか?

DROP PROCEDURE IF EXISTS medatabase.SP_rptProvince2;
CREATE PROCEDURE medatabase.`SP_rptProvince2`(
 IN e_Region VARCHAR(45)
  )
BEGIN

 DECLARE strQuery VARCHAR(1024);
 DECLARE stmtp   VARCHAR(1024);
  SET @strQuery = CONCAT('SELECT * FROM alldata where 1=1');
  IF e_region IS NOT NULL THEN
   SET @strQuery = CONCAT(@strQuery, ' AND (regionName)'=e_Region);
  END IF;

 PREPARE  stmtp FROM  @strQuery;
 EXECUTE  stmtp;
END;
4

2 に答える 2

12

私の知る限り、そのような可変引数リストを持つことはできません。次のいずれかを行うことができます。

  1. パラメータの固定最大数を取り、連結する前に null かどうかをチェックします。

    CREATE PROCEDURE SP_rptProvince2(a1 VARCHAR(45), a2 VARCHAR(45), ...)
    
    ...
    
      IF a1 IS NOT NULL THEN
        SET @strQuery = CONCAT(@strQuery, ' AND ', a2);
      END IF;
    

    引数の基準が適用される事前定義されたフィールド (e_Region既存のコードのパラメーターなど) が必要な場合は、CONCAT 操作を適切に変更します。

    可能な呼び出し:

    CALL SP_rptProvince2('''North''', 'column3 = ''South''')
    
  2. 45 文字をはるかに超える単一のパラメーターを取得し、単純にクエリに追加します (null ではないことを前提としています)。

    明らかに、これはユーザーに正しい SQL コードを提供する責任を負わせます。

    可能な呼び出し:

    CALL SP_rptProvince2('RegionName = ''North'' AND column3 = ''South''')
    

2つから選択することはあまりありません。どちらも機能させることができます。どちらも完全に満足できるものではありません。

引数の文字列を余分な引用符で保護する必要があることに気付くかもしれません。それが、これを問題にするようなものです。

于 2012-04-29T04:22:22.837 に答える