2016-06-11 49 views
-3

我嘗試做以下查詢:UCASE和上SQL函數

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

在的servlet的使用爲例來訪問數據庫 但我收到錯誤消息:

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

另一方面,當我使用UPPER sql函數時,該示例可以工作,但結果不會以大寫形式顯示LASTNAME列的值。我不明白髮生了什麼事。

+2

如果'lastName'將會是''; DROP DATABASE ...; - '? – lad2025

+0

我不知道。 – julian

+1

數據庫將被刪除,但前提是使用應用程序的用戶有權執行此操作。 @ lad2025暗示你應該在使用sql之前清理你的輸入。 – SubhasisM

回答

3

你只是比較大寫值,但你與select *

+0

好的。但是UCASE功能會發生什麼? – julian

+3

據我所知UCASE不是在Oracle(或SQL Server,也是您已標記的)上的有效函數 –

+0

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

1

選擇的實際值,以獲得您的結果集的大寫的名字,你需要在你的選擇列表,而不是UCASE使用大寫,如這個:

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

你的代碼在這裏做的是建立一個名爲query的查詢字符串。一旦query完成,它將被髮送到數據庫進行解析和運行。

當您構建對數據庫的查詢時,必須對數據庫要解析並運行的查詢部分使用內置的數據庫函數。因此,在您的示例中,Java在lastName上執行toUpperCase,然後將該文字放入將轉到數據庫的查詢字符串中。 UPPER(LAST_NAME)按原樣進入查詢字符串,它會像這樣傳遞到數據庫並由數據庫運行。所以它需要是一個數據庫可以解析和運行的函數:一個Oracle函數,而不是Java函數。