EGのユーザー入力に基づいていくつかの値を取得する選択クエリがあります:-
SELECT
company, accounts
from testdrive
WHERE company LIKE '&Company', accounts = '&Account'
order by company desc
Toad でこれを実行すると、ユーザーは値の入力を求められます..しかし、ユーザーが値とともに「条件」を指定する方法を知りたいですか?? Detno >、<、!= など
私は TOAD ユーザーではありませんが、TOAD は SQL Plus の置換変数機能に依存しているようです。SQL Plus 置換変数はバインド変数ではありません - それらはただの文字列置換です - そのため、好きなものを入れることができます。その場合、次のようなことをするとどうなるかを見たことがありますか。
SELECT company
, accounts
FROM testdrive
WHERE company &Company_Comparison '&Company'
AND accounts &Account_Comparison '&Account'
ORDER BY company DESC;
ユーザーは、!=、LIKE などを入力できる Company_Comparison と Account_Comparison の入力を求められる必要があります。もちろん、入力を検証することはできず、このようなものは SQL インジェクション攻撃に対して広く開かれていますが、クライアントは TOAD です。防弾ソリューションを実際に探しているわけではないと思います。
彼はできません。これには動的SQLが必要です。
引数として演算子を受け入れる各列の関数を記述します。このようにして、オペランド自体だけでなく、バインド変数を介して演算子を指定できます。ただし、オプティマイザは述語の選択性をまったくうまく計算できないため、この方法ではパフォーマンスの問題が発生する可能性があります。
例えば
FUNCTION company_is (company IN VARCHAR2, op IN VARCHAR2, value IN VARCHAR2) IS
BEGIN
RETURN CASE op
WHEN '=' THEN (company = value)
WHEN 'LIKE' THEN (company LIKE value)
WHEN '<' THEN (company < value)
...
END;
END;
FUNCTION date_is (thedate IN DATE, op IN VARCHAR2, value IN DATE) IS
BEGIN
RETURN CASE op
WHEN '=' THEN (thedate = value)
WHEN '<' THEN (thedate < value)
...
END;
END;
次に、次の方法で述語を指定できます。
SELECT company, accounts
FROM testdrive AS t
WHERE company_is(t.company,'&CompanyOp','&Company')
AND date_is(t.date_created,'&CreatedOp',TO_DATE('&Created','DD/MM/YYYY'))
ORDER BY company DESC
ただし、パフォーマンスの問題に注意してください。通常の方法で他の述語を指定できない場合は、フル スキャンしか表示されません。
これを行う直接的な方法はありません。
単純なケースでは、さまざまな比較にいくつかのパラメーターを指定することで、この制限を回避できます。
例えば
SELECT company, accounts from testdrive WHERE company LIKE '&Company', accounts = '&Account' AND date<&datesmaller AND date<=&datesmallerequal order by company desc
次に、datesmaller と datesmallerequal の両方を指定できます。必要のないものを遠い将来の日付に設定するだけで、条件は何もしません。
しかし、それは単純なケースでのみ機能します。一般に、動的 SQL またはストアド プロシージャ (内部で複雑なパラメーターを処理できる) が必要になります。