【问题标题】:Java Stored Proc Not ExecutingJava 存储过程未执行
【发布时间】:2012-10-10 13:13:35
【问题描述】:

我的 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: Input parameter not set, index: 4.'

【问题讨论】:

  • 你能贴出创建过程语句的顶部(包括变量、默认值等)

标签: java jdbc sap-ase


【解决方案1】:

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

【讨论】:

  • 但是我必须只使用存储过程中指定的默认值。那么如何修改我的代码以便只使用存储过程中指定的值。
【解决方案2】:

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

【讨论】:

  • 也试过了,但它给出了另一个例外,说“列不允许空值”
  • 是的,也试过了。返回不允许空值的异常。
【解决方案3】:

您还需要在索引 5 和 6 处设置值

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

类型参考这里:http://www.tutorialspoint.com/jdbc/jdbc-data-types.htm

编辑:如果你有 Not Null 约束,你没有办法,只能在读取数据时忽略的那些位置设置一些虚拟或空白值(ehh..必须为该检查),如果您真的不想这样做,那么为什么要首先设置 Not Null 约束呢? :-)

【讨论】:

  • 我试过了,它仍然返回一个异常,因为不允许使用空值。 cstmt.setNull(5,java.sql.Types.CHAR); cstmt.setNull(6,java.sql.Types.VARCHAR);
  • @gautamvegeta 检查您的数据库表是否对第 5 列和第 6 列有任何 not null 约束。
  • 是的,它确实有这些限制。但这就是为什么在我的存储过程中我提到了默认参数。我想要做的就是在 java 中的存储过程调用中跳过该参数。
【解决方案4】:

我不确定这是否适用于您的数据库,但是对于您不想指定的参数省略问号怎么办?那就是:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-23
    • 2010-09-15
    • 2012-10-24
    • 2016-02-08
    • 2014-09-26
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    相关资源
    最近更新 更多