【问题标题】:How to check if an SQL statement is a query or an update?如何检查 SQL 语句是查询还是更新?
【发布时间】:2020-04-20 22:03:25
【问题描述】:

我想在实际执行语句之前检查 SQL 语句是查询还是更新/插入/删除。现在我正在这样做:

if (stmt.execute(sqlStatement)) {
    // Deal with queries
}
else {
    // Deal with updates/inserts/deletes
}

其中 stmt 是 Java 语句。

问题是我只需要在更新/插入/删除表之前而不是在查询之前执行一些 SQL 逻辑。

【问题讨论】:

  • 一个选择会给你一个结果集,所有其他的影响行的数量。所以你必须经常检查它是否被选中来处理回复
  • 红旗。你不需要检查,因为你应该已经知道了。事实上,您并不意味着您可能正在做一些有问题的事情......而且缺少任何参数似乎也很可疑。出于安全和最佳实践的考虑,您可能需要解释为什么您的代码不知道这里正在尝试哪种查询。
  • @Michael-sqlbot 这是一个项目,用户通过jsp前端输入sql命令,在服务器端处理。当表中某个变量大于 100 时,业务逻辑应该在单独的表中更新一些东西。我需要事先知道它是什么类型的语句,这样我才能仅在语句是更新时创建一个临时表。无论如何,我最终只是创建了一个临时表,并在业务逻辑完成时将其删除。

标签: java mysql


【解决方案1】:

我能想到的方法有两种:

  1. 类似:

    if (sqlStatement.stripLeading().toLowerCase()startsWith("select")) { // 处理查询 } else { // 假设它是别的东西 }

  2. 另外,JDBC 有一个 getResultSet() 方法,打算在执行后使用,因此您的代码将是:

    // 处理查询准备 结果集结果 = jdbcStmtObj.getResultSet(); if (results != null) { // 我们有结果 }

【讨论】:

  • 我想我必须使用第一个选项,而是使用 if (!(sqlStatement.stripLeading().toLowerCase().startsWith("select")) 因为我需要处理不是选择的情况。第二个选项要求我首先执行该语句,这是我试图避免的。
  • 它们的出现是为了给你选择,伙计。
  • 对于 CTE,返回行的查询也可以以 WITH.. 开头。
  • 如果是 EXEC,你将无法从查询文本中判断它是否返回行。
  • @DawoodibnKareem 如果我没看错你的问题,我think you can
【解决方案2】:

如果查询包含在 php 字符串中...您不能使用 php 函数 strpos() 来查找有效词...然后基于此分支或执行您的 If 语句。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多