2012-10-10 96 views
0

我在Java代码中调用一个存储过程,它使用Sybase数据库如下:的Java存储过程不执行

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:准备语句:未设置输入参数,指数:4”

+0

您可以发布CREATE PROCEDURE语句的顶部(与变量,默认值等) – Hotel

回答

0

它看起来像'索引4'是指第五个参数(索引是从零开始的),所以我认为问题是默认参数没有被您的代码识别。

+0

但我只使用在存储proc.So规定如何修改默认值我的代码,以便只使用存储的proc中指定的值。 –

0

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

+0

也尝试过,但它给出了另一个异常,说“列不允许空值” –

+0

您是否尝试过使用setNull(5,your5thColumnType)方法? – dan

+0

是的,也试过了。返回空值不允许的异常。 –

0

您需要在指标设定值5 & 6也

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

对于TYPE参考这里:http://www.tutorialspoint.com/jdbc/jdbc-data-types.htm

编辑:如果您还没有空约束,你有没有办法,只能设置一些假或者在读取数据时你会忽略的那些位置上的空白值(如:为该检查写一些额外的代码),如果你真的不想这样做,那么为什么你在第一个位置设置了非空限制的。 :-)

+0

我试过foll,它仍然返回一个异常,因为不允许空值。 'cstmt.setNull(5,java.sql.Types.CHAR); cstmt.setNull(6,java.sql.Types.VARCHAR);' –

+0

@gautamvegeta检查你的数据库表是否对第5列和第6列有任何'not null'约束。 –

+0

是的,它确实有这些约束。但这就是为什么在我的存储过程中,我提到了默认参数。所有我想要做的就是在java中存储的proc调用中跳过该参数。 –

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();