0

私は現在、ユーザーが検索するためにさまざまな量の基準を入力する必要があるときに、動的なSelectステートメントを作成しようとしています。

現在、最も重要な部分を除いて、ステートメントのすべての部分が機能しています。

私はこのようなことをしようとしています:

selStmt := 'SELECT column_one, column_2, column_3
            FROM nerf
whereClause := ' WHERE TO_NUMBER('''|| column_one ||''') <= '''|| userInput ||'''';

ただし、これを行う場合、SELECTステートメントのWHEREの手がかりは、出力行に示されているように正確ではありません。

WHERE TO_NUMBER('') <= '5';

引用符を使用してさまざまな解決策を試しましたが、ORA-00905の識別子の欠落エラーが発生するか、ORA-00911:無効な文字エラーが発生します。

現時点では、この問題にどのように取り組むかはよくわかりません。

役立つヘルプは事前に感謝します。

4

2 に答える 2

0

何らかの理由で、Oracle は一重引用符を使用して文字列を区切り、文字をエスケープします。したがって、使用''は、文字列内に引用符を追加するように Oracle に指示します。例:

'This is a string with a quote here: '' and then it ends normally'

として表されます

This is a string with a quote here: ' and then it ends normally

あなたの例では、WHERE作成している句を終了してから、という PL/SQL 変数識別子を連結していますcolumn_one

' WHERE TO_NUMBER('''|| column_one ||''')

...そしてNULL識別子の値を使用すると、column_oneこれは次のように表されます

 WHERE TO_NUMBER('')

おそらくcolumn_one、同じ名前の PL/SQL 変数からではなく、クエリ内から参照する必要があるため、次のように引用符を削除する必要があります。

whereClause := ' WHERE TO_NUMBER(column_one) <= TO_NUMBER('''|| userInput ||''')';

Oracle で文字列をエスケープすることはしばしば腹立たしいことです。TOAD や SQL*Developer のような適切な構文強調表示を備えた優れた IDE があれば、大いに役立ちます。

于 2013-02-26T23:07:51.590 に答える
0

これはうまくいくはずです:

selStmt := 'SELECT column_one, column_2, column_3 FROM nerf';
whereClause := ' WHERE TO_NUMBER(column_one) <= TO_NUMBER('''|| userInput ||''')';
于 2013-02-26T22:55:52.520 に答える