java.sql.SQLException: 调用中无效的参数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java.sql.SQLException: 调用中无效的参数相关的知识,希望对你有一定的参考价值。
java.sql.SQLException: 调用中无效的参数
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:111)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:145)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:207)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:235)
at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:413)
at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:164)
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:34)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:752)
at java.sql.DriverManager.getConnection(DriverManager.java:579)
at java.sql.DriverManager.getConnection(DriverManager.java:243)
at com.cai.dbc.DatabaseConnection.<init>(DatabaseConnection.java:16)
at com.cai.dao.proxy.BbsDaoProxy.<init>(BbsDaoProxy.java:15)
at com.cai.factory.DaoFactory.getIBbsDaoInstance(DaoFactory.java:9)
at com.cai.dao.test.TestdaoInsert.main(TestdaoInsert.java:22)
JDBC - 从 JAVA 调用 PLSQL 给出 Java.sql.SQLException: ORA-06550
【中文标题】JDBC - 从 JAVA 调用 PLSQL 给出 Java.sql.SQLException: ORA-06550【英文标题】:JDBC - Calling PLSQL from JAVA gives Java.sql.SQLException: ORA-06550 【发布时间】:2018-10-26 16:53:41 【问题描述】:我在从 Java 调用 PLSQL 时遇到了很大的麻烦。 这是我的代码:
static final String PLSQL = "call DBK_PDG_METADATI_CEDOLINO.dbp_main(?,?,?,?,?,?,?,?,?)";
Connection conn = DataSourceUtils.getConnection(jdbcTemplate.getDataSource());
CallableStatement cs = conn.prepareCall(PLSQL);
for (Cedolino item : items)
LOG.info("################# ELABORAZIONE CEDOLINO " + item.getTestata().getAnagrafica().getCodFiscaleAmministrato() + " #################");
cedolini.getCedolino().add(item);
setParametersForPlSql(cs, item);
try
cs.execute();
catch(SQLException e)
LOG.info(e.toString());
cs.close();
conn.close();
private void setParametersForPlSql(CallableStatement cs, Cedolino ced)
try
cs.setInt("tipo_lancio", 1);
cs.setString("iscr", ced.getTestata().getTrattamento().getIscrizione().trim());
cs.setString("rts", ced.getTestata().getDpt().trim());
cs.setString("codfisc", ced.getTestata().getAnagrafica().getCodFiscaleAmministrato().trim());
cs.setString("lingua", this.lingua);
cs.setString("file_name", null);
cs.setString("dir_spec", null);
cs.setString("stato_elab", "S");
cs.setString("descr_elab", null);
catch (SQLException e)
e.printStackTrace();
除了cs.execute
,这段代码运行良好,这给了我这个错误
java.sql.SQLException: ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'DBP_MAIN'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
我检查了一千次,参数和类型和数字完全匹配。数据库连接也很好,因为我先做了一些缓存,它可以工作。
已经尝试删除DBK_PDG_METADATI_CEDOLINO
,但没有任何必要。
你能帮我弄清楚吗?
【问题讨论】:
如果您使用位置占位符 (?
),您应该使用基于索引的设置器(尽管我不能 100% 确定 Oracle 在这种情况下是否允许以任何方式命名)。
【参考方案1】:
-
问题可能与可能不支持命名参数的 JDBC 驱动程序有关。
尝试先检查一下:
Connection myConn = . . . // connection to the RDBMS for Database
DatabaseMetaData dbmd = myConn.getMetaData();
if (dbmd.supportsNamedParameters() == true)
System.out.println("NAMED PARAMETERS FOR CALLABLE"
+ "STATEMENTS IS SUPPORTED");
如果不是 - 使用参数索引而不是名称来设置...
-
该存储过程中是否有任何 OUT 或 INOUT 参数?
如果是这样,您需要使用registerOutParameter
的CallableStatement
注册这些参数,并为输出提供一个占位符。
【讨论】:
抱歉回复晚了!我使用参数索引尝试了您的解决方案,并且......它有效!原因可能是首先我使用 ojbdc14 作为 jar 并且命名参数正常,然后降级到 ojdbc5 后不再存在。谢谢你!以上是关于java.sql.SQLException: 调用中无效的参数的主要内容,如果未能解决你的问题,请参考以下文章
java.sql.SQLException:调用中的参数无效:getBytes()
java.sql.SQLException: 调用中无效的参数DSRA0010E: SQL 状态 = null,错误代码 = 17,433
java.sql.SQLException:Io 异常:在与 oracle 的 JDBC 连接期间从读取调用中得到减一
java.sql.SQLException: ORA-01008: 并非所有变量都使用 Mybatis 3 绑定
H2 java.sql.SQLException:找不到合适的驱动程序
启动tomcat时报错了, nested exception is java.sql.SQLException: 调用中无效的参数