Java存储过程不执行

时间:2012-10-10 13:13:35

标签: java jdbc sybase-ase

我的java代码中有一个存储过程调用,它使用sybase数据库,如下所示:

CallableStatement cstmt=sigmaConnection.prepareCall("{call dbo.sp_insRadEntry(?, ?, ?, ?, ?, ?, ?)}");
cstmt.setString(1,"Nappa");
cstmt.setInt(2,40);
cstmt.setString(3,"Vegeta");
cstmt.setString(4,"Saiyan");
cstmt.setString(7,"Hello"); 

cstmt.execute();

正如你所看到的,我故意没有设置第5和第6个参数,因为我的存储过程提供了默认值,如果没有传递任何值,在这个调用中调用dbo.sp_insRadEntry(?,?,?,?,?, ?,?)我有7个参数,因为它不允许我设置第7个参数而没有7个逗号。

但即使我已经设置了第4个参数,我也得到以下异常:

'java.sql.SQLException:JZ0SA:Prepared Statement:输入参数未设置,索引:4。'

4 个答案:

答案 0 :(得分:0)

看起来'索引4'是指第五个参数(索引从零开始),所以我认为问题是你的代码无法识别默认参数。

答案 1 :(得分:0)

你应该尝试使用setNull方法设置缺少的第5和第6个参数。

答案 2 :(得分:0)

您需要在Index 5&amp ;; 6也

int type = TYPE
pst.setNull(index, type);

对于TYPE,请参阅此处:http://www.tutorialspoint.com/jdbc/jdbc-data-types.htm

编辑:如果您有非空约束,则无法在读取数据时忽略的那些位置设置一些虚拟或空白值(呃......要写一些额外的代码那个检查)如果你真的不想这样做那么为什么你首先设置Not Null约束来考虑它。 : - )

答案 3 :(得分:0)

我不确定这会在您的数据库中有效,但是如果省略您不想指定的参数的问号呢?那就是:

CallableStatement cstmt=sigmaConnection.prepareCall(
        "{call dbo.sp_insRadEntry(?, ?, ?, ?, , , ?)}");
cstmt.setString(1,"Nappa");
cstmt.setInt(2,40);
cstmt.setString(3,"Vegeta");
cstmt.setString(4,"Saiyan");
cstmt.setString(5,"Hello"); 

cstmt.execute();