2016-06-11 9 views
-3

私は次のクエリを行うにしようとしています:データベース にアクセスするためのサーブレットの使用例ではUCASEおよびUPPER SQL関数

String query = "SELECT * FROM EMP WHERE UCASE(LAST_NAME) "; 
query += "LIKE '" + lastName.toUpperCase() + "%'"; 

をしかし、私はエラーメッセージを取得しています:

Excepcion java.sql.SQLSyntaxErrorException: ORA-00904: "UCASE": invalid identifier 

一方、UPPER SQL関数を使用すると、この例は機能しますが、結果は大文字のLASTNAME列の値を表示しません。私は何が起こるのか分からない。

+2

'lastName'が' 'であればどうなりますか? DROP DATABASE ...; - '? – lad2025

+0

私はそれを知らない。 – julian

+1

データベースは削除されますが、アプリケーションを使用しているユーザーが権限を持っている場合に限ります。 @ lad2025は、SQLの実行中に入力を使用する前に入力をサニタイズする必要があることを暗示しています。 – SubhasisM

答えて

3

あなただけの大文字値を比較しているが、あなたは次のように、あなたはあなたの選択リストではなく、UCASEでUPPERを使用する必要があなたの結果セットで大文字の名前を取得するためにselect *

+0

しかし、UCASE機能はどうなりますか? – julian

+3

私が知る限り、UCASEはOracle(またはタグを付けたSQL Server)の有効な機能ではありません –

+0

https://docs.oracle.com/database/121/SQLRF/functions002.htm#CJAEEJFC –

1

と実際の値を選択していますこれは

String query = "SELECT UPPER(LAST_NAME) AS UPPERNAME, * FROM EMP WHERE UPPER(LAST_NAME) "; 
query += "LIKE '" + lastName.toUpperCase() + "%'"; 

ここでは、queryという名前のクエリ文字列を作成しています。 queryが完了すると、解析と実行のためにデータベースに送信されます。

データベースにクエリを作成する場合は、データベースが解析および実行するクエリの部分に組み込みのデータベース関数を使用する必要があります。したがって、あなたの例では、JavaはtoUpperCaselastNameにして、そのリテラルをデータベースに行くクエリ文字列に入れています。 UPPER(LAST_NAME)はそのままクエリ文字列に入り、データベースに渡され、データベースによって実行されます。したがって、データベースが解析して実行できる関数である必要があります.Oracle関数であり、Java関数ではありません。

関連する問題