Oracle JDBC中的PreparedStatement占位符过多
使用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中的占位符為65536 ( 2 16 )。
我以前曾 寫過 一篇關于ORA-01795錯誤的博客 ,該錯誤是在Oracle SQL IN條件中嘗試包含1000個以上的值時發生的。 有多種方法可以解決此限制,一種替代方法可能是使用多個OR來對超過1000個值進行“ OR ” OR 。 通常,這將通過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占位符过多的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 评价褒贬不一,网友开箱苹果 iPhone
- 下一篇: RPG 游戏《第一后裔》17 分钟实机演