UCASE 和 UPPER sql 函数

UCASE and UPPER sql functions

我正在尝试执行以下查询:

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 列的值。我不明白发生了什么。

您只是在比较大写值,但您选择的是 select *

的实际值

要在结果集中获取大写名称,您需要在 select 列表中使用 UPPER,而不是 UCASE,如下所示:

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

您的代码在这里所做的是构建一个名为 query 的查询字符串。一旦query完成后,将被发送到数据库进行解析和运行ning。

当您构建对数据库的查询时,您必须对数据库要解析的查询部分使用内置的数据库函数,运行。因此,在您的示例中,Java 在 lastName 上执行 toUpperCase,然后将该文字放入将转到数据库的查询字符串中。 UPPER(LAST_NAME) 按原样进入查询字符串,它将像那样传递到数据库,并由数据库 运行 传递。所以它需要是一个数据库可以解析的函数和运行:一个Oracle函数,而不是Java函数。

UCASE 是 DB2 函数而不是 Oracle。对于 Oracle,您需要使用 UPPER

James Z 已经回答了你问题的第二部分。

话虽如此,我回答是因为之前的回答没有指出 SQL 您列出查询的方式存在注入问题。

养成总是使用 jdbc 执行参数化查询的习惯,而不是直接将值附加到查询字符串。

String query = "SELECT * FROM EMP WHERE UCASE(LAST_NAME) LIKE ? ";

您的参数将是 - lastName.toUpperCase()+"%"

SQL Injection