接收java.sql.SQLException:调用数据库函数时出现无效列索引错误
我正在尝试使用callable语句调用数据库函数。存储过程的签名如下所示接收java.sql.SQLException:调用数据库函数时出现无效列索引错误,java,sql,function,Java,Sql,Function,我正在尝试使用callable语句调用数据库函数。存储过程的签名如下所示 function DUMMY_FUNCTION (PARAM1 in Number ,PARAM2 in Number ,PARAM3 in varchar2 ,PARAM4 i
function DUMMY_FUNCTION (PARAM1 in Number
,PARAM2 in Number
,PARAM3 in varchar2
,PARAM4 in Number
,PARAM5 in Date
,PARAM6 in Number
,PARAM7 out varchar2
,PARAM8 out varchar2)
返回varchar2
调用的JAVA代码如下:
//加载SQl二进制文件
导入java.sql.CallableStatement;
导入java.sql.Connection;
导入java.sql.Date;
导入java.sql.DriverManager;
导入java.text.simpleDataFormat;
公共类调用过程{
公共静态字符串调用过程(int-PARAM1、int-PARAM2、String-PARAM3、int-PARAM4、String-PARAM5、int-PARAM6)引发异常{
//定义参数
字符串结果=新字符串();
连接conn=null;
CallableStatement cs=null;
字符串outParam=null;
SimpleDataFormat sdf=新SimpleDataFormat(“yyyy-MM-dd”);
试一试{
conn=getDBConnection();
字符串函数=
“{?=调用P1SCHEMA.DUMMY_包.DUMMY_函数(?,,,,,,,?)}”;
连接设置自动提交(错误);
cs=连接准备呼叫(proc3Function);
java.sql.Date param5date=new java.sql.Date(sdf.parse(PARAM5.getTime());
//定义输入参数
cs.setInt(1,参数1);
cs.setInt(2,参数2);
cs.设置管柱(3,参数3);
cs.setInt(4,参数4);
cs.设置日期(5,param5date);
cs.setInt(6,PARAM6);
//定义输出参数
registerOutParameter(7,java.sql.Types.VARCHAR);
registerOutParameter(8,java.sql.Types.VARCHAR);
registerOutParameter(9,java.sql.Types.VARCHAR);
//执行语句
cs.execute();
//捕获输出
outParam=cs.getString(8);
字符串I=新字符串(输出参数);
//集合结果数组
结果=I.toString()+“####”+cs.getString(7)+“###”+cs.getString(8)+“###”+cs.getString(9);
//检查从存储过程返回的原因码
如果(输出参数==“S”)
{
//回滚事务
连接回滚();
}
其他的
{
//提交事务
conn.commit();
}
}
捕获(例外e)
{
e、 printStackTrace();
}
最后
{
如果(cs!=null)
{
//密切联系
cs.close();
}
如果(conn!=null)
{
//密切联系
康涅狄格州关闭();
}
}
//将数组返回到客户端
返回结果;
}
公共静态连接getDBConnection()引发异常{
String driver=“oracle.jdbc.xa.client.oraclexadasource”;
String url=“jdbc:oracle:thin:@localhost:1539:DEV”;
字符串username=“user”;
字符串password=“password”;
Class.forName(驱动程序);
Connection conn=DriverManager.getConnection(url、用户名、密码);
返回连接;
}
公共静态void main(字符串args[])引发异常{
InvokeProcedure INP=新的InvokeProcedure();
字符串Args=INP.callProcedure(1,2,“A”,3,“2016-01-23”,4);
系统输出打印项次(Args);
}
}
很抱歉,由于它不在代码段中,因此错过了它。我想您需要首先注册输出参数,因为您有语句“?=…”因此它将是cs.registerOutParameter(1,java.sql.Types.VARCHAR);然后是没有最后一个参数的其他参数,当然是Stan的函数有8个参数,但调用只有6个(?,?,?,?,,?,?)
:
使用:
然后-位置参数从左到右编号。:
-这是第一个参数,它的索引是1,{?=
使用cs.registerOutParameter(1,java.sql.Types.SomeType)
连续有2,3,4,…8,9个参数(?,?,,,,,,,,,,?)
cs.registerOutParameter(8, java.sql.Types.VARCHAR);
cs.registerOutParameter(9, java.sql.Types.VARCHAR);
看起来你的函数只有2个out参数,但是你正在注册3Hi Stan,我在最后还有返回varchar2,在构建模式时,我得到了三个参数。很抱歉,由于它在代码段之外,所以错过了它。我想你需要先注册输出参数,因为你有语句“?=…”,所以它将是cs.registerOutParameter(1,java.sql.Types.VARCHAR);然后是没有最后一个参数的其他参数谢谢..愚蠢的错误:)谢谢
"{? = call P1SCHEMA.DUMMY_PACKAGE.DUMMY_FUNCTION(?, ?, ?, ?, ?, ?, ?, ?) }";
cs.setInt(2, PARAM1);
cs.setInt(3, PARAM2);
cs.setString(4, PARAM3);
...
cs.registerOutParameter(8, java.sql.Types.VARCHAR);
cs.registerOutParameter(9, java.sql.Types.VARCHAR);