groovy sql_Groovy Sql和Oracle'无效列索引'SQLException

本文探讨了在Groovy中使用def关键字与Oracle数据库进行交互时可能遇到的“无效列索引”SQLException。通过明确类型声明或使用as关键字,可以避免这一常见问题,确保GroovySQL查询的正确执行。

groovy sql

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

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

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

#!/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

groovy sql

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值