Groovy Sql和Oracle'无效列索引'SQLException

Groovy的def 关键字存在一些较小的潜在危险。 针对Java开发人员Groovy样式和语言功能指南提供了有关def使用的一些警告。 在此博客文章中,我展示了在将Groovy SQL与Oracle数据库配合使用时进行键入时更加明确的优点,从而避免了潜在的“ 无效列索引SQLException,因为我已经多次遇到此问题。

以下Groovy脚本在与提供的搜索字符串匹配的Oracle数据库表上提供注释。 在这种情况下,脚本的作用不如查看定义SQL查询字符串的代码(第18-21行)重要。

searchDbComments.groovy(使用不带String键入或作为String的def)

#!/usr/bin/env groovy
// searchDbComments.groovy

this.class.classLoader.rootLoader.addURL(
   new URL("file:///C:/oraclexe/app/oracle/product/11.2.0/server/jdbc/lib/ojdbc6.jar"))

if (args.length < 1)
{
   println "USAGE: searchDbComments.groovy <searchString>"
   System.exit(-1)
}

def searchString = args[0].toUpperCase()

import groovy.sql.Sql
def sql = Sql.newInstance("jdbc:oracle:thin:@localhost:1521:xe", "hr", "hr",
                          "oracle.jdbc.pool.OracleDataSource")
def dbTableCommentsQry = """
SELECT table_name, table_type, comments
  FROM user_tab_comments
 WHERE UPPER(comments) LIKE '%${searchString}%'"""

sql.eachRow(dbTableCommentsQry)
{
   println "${it.table_name} (${it.table_type}): ${it.comments}"
}

当执行上述代码时,会产生以下错误:

WARNING: Failed to execute: 
SELECT table_name, table_type, comments
  FROM user_tab_comments
 WHERE UPPER(comments) LIKE '%?%' because: Invalid column index

Caught: java.sql.SQLException: Invalid column index

java.sql.SQLException: Invalid column index
    at oracle.jdbc.driver.OraclePreparedStatement.setStringInternal(OraclePreparedStatement.java:5303)
    at oracle.jdbc.driver.OraclePreparedStatement.setObjectCritical(OraclePreparedStatement.java:8323)
    at oracle.jdbc.driver.OraclePreparedStatement.setObjectInternal(OraclePreparedStatement.java:8259)
    at oracle.jdbc.driver.OraclePreparedStatement.setObjectInternal(OraclePreparedStatement.java:9012)
    at oracle.jdbc.driver.OraclePreparedStatement.setObject(OraclePreparedStatement.java:8993)
    at oracle.jdbc.driver.OraclePreparedStatementWrapper.setObject(OraclePreparedStatementWrapper.java:230)
    at searchDbComments.run(searchDbComments.groovy:23)

解决“无效的列索引” SQLException很容易。 一种解决方案是将第18-21行的“ def”更改为显式的“ String”类型。 在下一个代码清单中显示的另一种解决方案是使用Groovy的“ as ”强制关键字来显式允许使用“ def”,并将dbTableCommentsQry变量键入为String。

searchDbComments.groovy(用作字符串)

#!/usr/bin/env groovy
// searchDbComments.groovy

this.class.classLoader.rootLoader.addURL(
   new URL("file:///C:/oraclexe/app/oracle/product/11.2.0/server/jdbc/lib/ojdbc6.jar"))

if (args.length < 1)
{
   println "USAGE: searchDbComments.groovy <searchString>"
   System.exit(-1)
}

def searchString = args[0].toUpperCase()

import groovy.sql.Sql
def sql = Sql.newInstance("jdbc:oracle:thin:@localhost:1521:xe", "hr", "hr",
                          "oracle.jdbc.pool.OracleDataSource")
def dbTableCommentsQry = """
SELECT table_name, table_type, comments
  FROM user_tab_comments
 WHERE UPPER(comments) LIKE '%${searchString}%'""" as String

sql.eachRow(dbTableCommentsQry)
{
   println "${it.table_name} (${it.table_type}): ${it.comments}"
}

仅使用“ def”或根本不使用任何类型的“ def”都会导致上述错误。 通过静态类型或使用“ as ”关键字显式定义查询中使用的String变量,可使代码正确执行。 可以使用带有“ def”的静态类型,但这被认为是多余的。

使用“ def ”不一定没有错,但确实需要注意其应用。 纪尧姆·拉福格(Guillaume Laforge写道 :“ def在方法主体或特定的动态方面都很好,但是对于所有与“合同”有关的内容(方法签名,属性等),最好使用显式类型。”


翻译自: https://www.javacodegeeks.com/2013/07/groovy-sql-and-oracle-invalid-column-index-sqlexception.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值