複数のパラメーター(つまり、pName、pHeight、pTeam)を受け入れるストアドプロシージャがあります
クエリは次のように作成されています。
SQLQuery VARCHAR2(6000);
TestCursor T_CURSOR;
SQLQuery := 'SELECT ID, Name, Height, Team FROM MyTable WHERE ID IS NOT NULL ';
-- Build the query based on the parameters passed.
IF pName IS NOT NULL
SQLQuery := SQLQuery || 'AND Name LIKE :pName ';
END IF;
IF pHeight IS > 0
SQLQuery := SQLQuery || 'AND Height = :pHeight ';
END IF;
IF pTeam IS NOT NULL
SQLQuery := SQLQuery || 'AND Team LIKE :pTeam ';
END IF;
OPEN TestCursor FOR SQLQuery USING pName, pHeight, pTeam;
すべてのパラメータを渡してプロシージャを実行すると、正しく実行されます。
しかし、パラメータの1つまたは2つだけを渡した場合、プロシージャはエラーになります。
ORA-01006: bind variable does not exist
パラメータ値が使用された場所に基づいて、変数をパラメータに選択的にバインドするにはどうすればよいですか?たとえば、pNameのみが渡された場合、クエリのみを実行します。
OPEN TestCursor FOR SQLQuery USING pName;
または、pNameとpTeamの両方が渡された場合、次のようになります。
OPEN TestCursor FOR SQLQuery USING pName, pTeam;
誰かがこれを解決するためのより多くの方法を捨てることができることを願っています。ありがとう。
編集:私は実際に以下を使用することができます:
-渡されたパラメータに基づいてクエリを作成します。pNameがNULLでない場合SQLQuery:= SQLQuery || 'AND Name LIKE''' || pName || ''''; END IF;
IF pHeight IS > 0
SQLQuery := SQLQuery || 'AND Height = pHeight ';
END IF;
IF pTeam IS NOT NULL
SQLQuery := SQLQuery || 'AND Team LIKE ''' || pTeam || ''' ';
END IF;
OPEN TestCursor FOR SQLQuery;
しかし、これはSQLインジェクションに対して非常に脆弱です...