2009-07-20 9 views
-1

私はEGのために、ユーザの入力に基づいていくつかの値をフェッチする選択クエリがあります: - ヒキガエルでこれを実行するにはSQLとヒキガエル

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

を、ユーザーが値を入力するように求めている..しかし、私が知りたいですどのようにしてユーザーは値と共に "条件"を指定できますか? Detno>、<、!= etc

答えて

2

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

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やストアドプロシージャ(内部で複雑なパラメータを処理できる)が必要になります。

3

私はTOADユーザーではありませんが、TOADはSQL Plusの置換変数機能に依存しているようです。 SQLプラスの置換変数はバインド変数ではありません。単純なダンプ文字列置換なので、必要なものは任意のものに入れることができます。 !もちろん

SELECT company 
     , accounts 
    FROM testdrive 
    WHERE company &Company_Comparison '&Company' 
    AND accounts &Account_Comparison '&Account' 
ORDER BY company DESC; 

ユーザーは、彼らが入る可能性がCompany_ComparisonとAccount_Comparison、の入力を求められなければならない=、LIKE、など、あなたが勝った:それはケースであること、あなたはこのような何かをすれば何が起こるか見てきました彼らの入力を検証することはできません。このようなものはSQLインジェクション攻撃に対して広く開かれていますが、クライアントがTOADなので、あなたは本当に防弾ソリューションを探していないと思います。

+0

これは、移動する方法の1つになる可能性があります。 SQL * PLusでは、&代入変数を使用して文の一部を確実に提供できます。また、TOADも同じことをしています。 –

1

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

パフォーマンスの問題のために

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 

をしかし、気を付ける - あなたは、通常の方法でいくつかの他の述部を指定することができない限り、あなたはつもりだが、何も見えません。

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; 

次に、あなたは、このように述語を供給することができますフルスキャン!

関連する問題