概述
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
最后
以上就是潇洒黄蜂为你收集整理的Groovy Sql和Oracle'无效列索引'SQLException的全部内容,希望文章能够帮你解决Groovy Sql和Oracle'无效列索引'SQLException所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复