【问题标题】:UCASE and UPPER sql functionsUCASE 和 UPPER sql 函数
【发布时间】:2016-10-12 10:27:04
【问题描述】:

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

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

【问题讨论】:

  • 如果lastName'; DROP DATABASE ...;-- 怎么办?
  • 数据库将被删除,但前提是使用该应用程序的用户有权这样做。 @lad2025 暗示您应该在 sql 触发中使用之前清理您的输入。

标签: java oracle oracle11gr2


【解决方案1】:

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

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

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

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

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

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

SQL Injection

【讨论】:

    【解决方案2】:

    要在结果集中获取大写名称,您需要在选择列表中使用 UPPER,而不是 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函数。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 好的。但是 UCASE 函数会发生什么?
      • 据我所知,UCASE 不是 Oracle(或 SQL Server,您也已标记)上的有效函数
      • 我正在使用 Oracle 数据库,11g 第 2 版 (11.2),我找到了以下 sql 兼容性表:docs.oracle.com/cd/E11882_01/gateways.112/e12014/… 但我是数据库新手,我不了解 UPPER 和此表中的 UCASE。
      • 您是否阅读了表格上方的内容? Table 4-1 describes how Oracle database and the gateway handle SQL functions for a DB2 UDB for z/OS。如果您不使用类似的东西,只需使用 UPPER,它是正确的功能。
      猜你喜欢
      • 2012-04-15
      • 2019-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多