我收到java.sql.sqlexception:使用CallableStatement的无效列索引错误

时间:2018-09-21 19:13:17

标签: java sql oracle

我正在对CallableStatement使用插入查询。这是我作为字符串的查询:

String strInsert = "INSERT INTO this_table (loc_nbr, rpt_nbr, rpt_type, office_code, date_submitted, rpt_seq, alcohol, drugs, cyber, priority) VALUES (?, ?, ?, 'HOME', sysdate, ?, ?, ?, ?, ?);";

我正在使用的CallableStatement是:

CallableStatement cs = Connection.prepareCall(strInsert);
cs.setString(1, "'" + strLocationNumber + "'");
cs.setString(2, "'" + strReportNumber + "'");
cs.setString(3, "'" + strReportType + "'");
cs.setString(6, "'" + strReportSeq + "'");
cs.setString(7, "'" + strAlcohol + "'");
cs.setString(8, "'" + strDrugs + "'");
cs.setString(9, "'" + strCyber + "'");
cs.setString(10, "'" + strPriority + "'");
cs.execute();

运行此命令后,我得到一个java.sql.SQLException: Invalid column index

我当前正在使用Oracle作为数据库,我想确切地说明为什么收到此错误。

2 个答案:

答案 0 :(得分:4)

这表明通过Callable的表结构和插入语句在查询中可用和提供的列中不匹配

Java封装了此异常,以更深入地了解callable / prepared / sql语句。

需要检查?的占位符索引,然后将您的硬编码值从HOME and sysdate中间移到远端,然后占位符索引的连续性会很好。 / p>

String strInsert = "INSERT INTO this_table (loc_nbr, rpt_nbr, rpt_type,  rpt_seq, alcohol, drugs, cyber, priority,office_code,date_submitted) VALUES (?, ?, ?, ?, ?, ?, ?, ?,'HOME', sysdate,);";

CallableStatement cs = Connection.prepareCall(strInsert);
cs.setString(1, "'" + strLocationNumber + "'");
cs.setString(2, "'" + strReportNumber + "'");
cs.setString(3, "'" + strReportType + "'");
cs.setString(4, "'" + strReportSeq + "'");
cs.setString(5, "'" + strAlcohol + "'");
cs.setString(6, "'" + strDrugs + "'");
cs.setString(7, "'" + strCyber + "'");
cs.setString(8, "'" + strPriority + "'");
cs.execute();

答案 1 :(得分:2)

setString()索引号应该是指?占位符的第n次出现。

您的查询有两个硬编码值

'HOME', sysdate

它们不算作占位符索引。