使用Oracle数据库时,导致ORA-01745(“无效的主机/绑定变量名称错误”)错误的原因有多种。 关于错误ORA-01500到ORA-02098的Oracle 9i文档提供了有关ORA-01745的更多详细信息。 它指出,“原因”是“绑定变量或INTO规范中的冒号后跟一个不合适的名称,也许是一个保留字。” 它还指出“操作”是“更改变量名称并重试该操作。” 但是,在相同的Oracle 12g文档中 ,没有描述ORA-01745的“原因”或“措施”,原因可能是与此消息相关联的原因有多种,并且有多种相应的措施。 在本文中,我将重点介绍可能不太明显的原因之一,以及对该原因采取的相应措施。

ORA-01745的一些常见原因(我将不在本文中重点介绍)包括使用Oracle数据库保留名 ( 保留字 )作为标识符 , 多余或缺少冒号或逗号 ,或尝试绑定结构名(而不是绑定结构名)。变量)到占位符 。

除了上面列出的原因以及可能的其他潜在ORA-01745原因之外,另一个可能导致ORA-01745错误的情况是使用了太多? Oracle数据库的JDBC PreparedStatement中的占位符。 我将在这篇文章中证明多少? 导致此ORA-01745的PreparedStatement中的占位符为655362 16 )。

我以前曾 写过 一篇关于ORA-01795错误的博客 ,该错误是在Oracle SQL IN条件中尝试包含1000个以上的值时发生的。 有多种方法可以解决此限制,一种替代方法可能是使用多个OR来对超过1000个值进行“ OROR 。 通常,这将通过PreparedStatement?来实现? SQL语句中放置的占位符,用于每个OR值。 这种基于PreparedStatement的替代方法使用? 占位符只有在进行“ OR vales数目小于65536时才起作用。

下面的代码清单演示了如何生成针对Oracle HR模式的SQL查询,以使其易于再现过多的ORA-01745错误? 占位符( 可在GitHub上找到完整的代码清单)。

建立指定数量为?准备好的语句 占位符

/*** Constructs a query using '?' for placeholders and using* as many of these as specified with the int parameter.** @param numberPlaceholders Number of placeholders ('?')*    to include in WHERE clause of constructed query.* @return SQL Query that has provided number of '?" placeholders.*/
private String buildQuery(final int numberPlaceholders)
{final StringBuilder builder = new StringBuilder();builder.append("SELECT region_id FROM countries WHERE ");for (int count=0; count < numberPlaceholders-1; count++){builder.append("region_id = ? OR ");}builder.append("region_id = ?");return builder.toString();
}

下一个代码清单演示了基于在最后一个代码清单中构造的查询来构建PreparedStatement的过程,并使用与?的数量相匹配的多个连续整数设置其占位符? 占位符。

配置PreparedStatement? 占位符

/*** Execute the provided query and populate a PreparedStatement* wrapping this query with the number of integers provided* as the second method argument.* * @param query Query to be executed.* @param numberValues Number of placeholders to be set in the*    instance of {@code PreparedStatement} used to execute the*    provided query.*/
private void executeQuery(final String query, final int numberValues)
{try (final Connection connection = getDatabaseConnection();final PreparedStatement statement = connection.prepareStatement(query)){for (int count = 0; count < numberValues; count++){statement.setInt(count+1, count+1);}final ResultSet rs = statement.executeQuery();while (rs.next()){out.println("Region ID: " + rs.getLong(1));}}catch (SQLException sqlException){out.println("ERROR: Unable to execute query - " + sqlException);}
}

下一个屏幕快照显示当数量为?时发生的ORA-01745错误? 应用的占位符为65536。

此示例显示最大数量为? 可以在Oracle SQL语句中使用的占位符。 幸运的是,还有其他方法可以实现这种类型的功能,而没有ORA-01475限制为65536 ? 占位符或1000个IN元素限制导致ORA-01795错误

翻译自: https://www.javacodegeeks.com/2017/11/many-preparedstatement-placeholders-oracle-jdbc.html

Oracle JDBC中的PreparedStatement占位符过多相关推荐

  1. java mysql 占位符_在Java中编写带占位符的SQL语句

    C#中SQL中带占位符的语句 假设有一张学员信息表Student,通过表中的ID来找学员,查询的SQL语句如下 string sql = string.Format("select * fr ...

  2. 关于JDBC中的 PreparedStatement 的使用讲解

    **关于JDBC中的 PreparedStatement 的使用讲解@**TOC 文章转载于博客 https://www.cnblogs.com/ysw-go/p/5459330.html 如有侵权, ...

  3. android 布局 站位符,基于android布局中的常用占位符介绍

    大家在做布局文件是肯定会遇到过下面的这种情况 填充出现问题,所以需要用到占位符规范填充 汉字常用占位符: android:layout_width="wrap_content" a ...

  4. android 多个占位符,基于android布局中的常用占位符介绍

    大家在做布局文件是肯定会遇到过下面的这种情况 填充出现问题,所以需要用到占位符规范填充 汉字常用占位符: android:layout_width="wrap_content" a ...

  5. 你会用PPT中的图片占位符吗?超级好用,不错的技能

    在设计PPT的时候,或许大部分人都不离开图片的使用,不论是使用下载的素材还是自己设计的PPT,都有图片的存在. PPT中的图片能增加页面的设计感和场景感,比如下面这些案例中的图片使用. 但是,这时就会 ...

  6. C语言中常用的占位符

    ------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS ...

  7. html一个汉字空格占位,HTML中汉字空格占位符

    == 普通的英文半角空格 ==   ==   == no-break space (普通的英文半角空格但不换行) == 中文全角空格 (一个中文宽度) ==   == en空格 (半个中文宽度) == ...

  8. DB2中sql语句占位符问题

    初到公司实习,让做一个网站,使用struts2+spring框架,数据库使用的是DB2,以前没接触过DB2,对它不了解.在写sql语句的时候遇到一些问题,首先就是在mysql下的limit到了DB2中 ...

  9. java sql in 占位符_Java中SQL语句占位符的使用

    使用占位符的好处 在SQL语句中使用?来代替具体的数值,可除去繁琐的字符串拼接操作,且可避免SQL注入的风险String sql="SELECT * FROM user_login WHER ...

最新文章

  1. android textview参差不齐,android textView 排版显示参差不齐的解决方法
  2. 对抗神经网络GAN到底学到了什么
  3. netty4搭建简单的http服务器
  4. Python 开发桌面小工具,让代码替我们干重复的工作!
  5. 从MapReduce的执行来看如何优化MaxCompute(原ODPS) SQL 1
  6. java 封闭类型_Java并发之线程封闭
  7. python是什么时候出现的_python诞生于什么时候
  8. Java程序员常用开发工具有哪些?
  9. VHDL串口通信 在FPGA开发板上测试 并解决没有识别到下载接口USB_Blaster(No Hardware问题)
  10. 转:成为Java高级程序员需要掌握哪些?
  11. python配置文件
  12. 字符流的相关概念和相关方法的使用、IO异常的处理以及Properties属性集
  13. 如何使用Ubuntu 13.10的磁盘分析器可视化观察分区使用率
  14. 用python获取指定路径下的所有目录路径和文件路径
  15. 机器学习笔记之配分函数(一)对数似然梯度
  16. Siege 简单教程
  17. Star miscellaneous
  18. Klin、Druid、ClickHouse核心技术对比
  19. Lake Shore定制探针台
  20. 基于JavaEE的大学生公寓管理系统

热门文章

  1. Hadoop入门(二十四)Mapreduce的求TopK程序
  2. 深入理解Java ClassLoader及在 JavaAgent 中的应用
  3. JavaFX UI控件教程(六)之Toggle Button
  4. Java 虚拟机对锁优化所做的努力
  5. 使用cardme读写VCard文件,实现批量导入导出电话簿
  6. Oracle入门(十四.18)之使用动态SQL
  7. Java NIO总结
  8. 《四世同堂》金句摘抄(三)
  9. 循环录(输)入 java 课的学生成绩(5个学生),统计分数大于等于 80 分的学生
  10. java人脸识别更新:摄像头支持360、火狐和谷歌浏览器