我是靠谱客的博主 潇洒黄蜂,最近开发中收集的这篇文章主要介绍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在方法主体或特定的动态方面都很好,但是对于所有与“合同”有关的内容(方法签名,属性等),最好使用显式类型。”

参考:来自我们的JCG合作伙伴 Dustin Marx的Groovy Sql和Oracle'Invalid column index'SQLException , 来自Inspired by Actual Events博客。

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

最后

以上就是潇洒黄蜂为你收集整理的Groovy Sql和Oracle'无效列索引'SQLException的全部内容,希望文章能够帮你解决Groovy Sql和Oracle'无效列索引'SQLException所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(36)

评论列表共有 0 条评论

立即
投稿
返回
顶部