-1

EGのユーザー入力に基づいていくつかの値を取得する選択クエリがあります:-

SELECT 
  company, accounts 
from testdrive 
WHERE company LIKE '&Company', accounts = '&Account' 
order by company desc

Toad でこれを実行すると、ユーザーは値の入力を求められます..しかし、ユーザーが値とともに「条件」を指定する方法を知りたいです?? Detno >、<、!= など

4

4 に答える 4

3

私は 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 です。防弾ソリューションを実際に探しているわけではないと思います。

于 2009-07-20T16:24:07.403 に答える
2

彼はできません。これには動的SQLが必要です。

于 2009-07-20T12:03:15.013 に答える
1

引数として演算子を受け入れる各列の関数を記述します。このようにして、オペランド自体だけでなく、バ​​インド変数を介して演算子を指定できます。ただし、オプティマイザは述語の選択性をまったくうまく計算できないため、この方法ではパフォーマンスの問題が発生する可能性があります。

例えば

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

ただし、パフォーマンスの問題に注意してください。通常の方法で他の述語を指定できない場合は、フル スキャンしか表示されません。

于 2009-07-22T02:11:46.973 に答える
0

これを行う直接的な方法はありません。

単純なケースでは、さまざまな比較にいくつかのパラメーターを指定することで、この制限を回避できます。

例えば

SELECT company, accounts from testdrive WHERE company LIKE '&Company', accounts = '&Account' AND date<&datesmaller AND date<=&datesmallerequal order by company desc

次に、datesmaller と datesmallerequal の両方を指定できます。必要のないものを遠い将来の日付に設定するだけで、条件は何もしません。

しかし、それは単純なケースでのみ機能します。一般に、動的 SQL またはストアド プロシージャ (内部で複雑なパラメーターを処理できる) が必要になります。

于 2009-07-20T12:12:40.333 に答える