CallableStatement、OUT参数和将非JDBC参数表达式作为参数传递-索引是如何工作的?

CallableStatement、OUT参数和将非JDBC参数表达式作为参数传递-索引是如何工作的?,jdbc,stored-functions,callable-statement,Jdbc,Stored Functions,Callable Statement,关于存储过程的OUT参数与其他各种JDBC特性的交互,文档似乎非常模糊。我是否正确地假定,传递给registerOutParameter方法的索引必须是过程参数的基于1的索引,并且与作为该参数参数传递的PreparedStatement参数的索引不同?当过程的参数是文本(或不依赖于JDBC参数的SQL表达式)或参数表达式依赖于两个JDBC参数时,可能会出现差异/歧义 c.prepareCall("{? = call myfunc(?, 1, ?, ? + ?, 2)}")

关于存储过程的OUT参数与其他各种JDBC特性的交互,文档似乎非常模糊。我是否正确地假定,传递给
registerOutParameter
方法的索引必须是过程参数的基于1的索引,并且与作为该参数参数传递的
PreparedStatement
参数的索引不同?当过程的参数是文本(或不依赖于JDBC参数的SQL表达式)或参数表达式依赖于两个JDBC参数时,可能会出现差异/歧义

c.prepareCall("{? = call myfunc(?, 1, ?, ? + ?, 2)}")
  • 在本例中,如果程序的最后三个参数是In/OUT参数,则应注册的索引为1、4、5、6-正确吗
  • 如果我切换到
    {call myfunc(?,1,,?+,2)}
    的过程语法,它们会下降1到3,4,5-正确吗
  • 通过实验,我发现游标输出参数可以由
    (ResultSet)getObject(I)
    检索,除非它是函数的返回类型,在这种情况下,它变成了简单的“statement.getResultSet”。这种行为是独立于供应商的吗
  • 如果对
    CallableStatement
    进行批处理,是否可以检索OUT参数?如果是,是否只有最后一次执行的结果可用

  • 关于问题1,
    registerOutParameter
    使用的索引是
    占位符的索引。此外,如果函数
    myfunc
    的最后三个参数是
    OUT
    参数,则数据库将报告尝试调用上述函数时出现的错误。假设值7在
    myfunc
    的最后一个参数的第二秒内返回:这应该如何在两个
    占位符之间分割?这就是为什么我假设out参数独立于JDBC out参数-该值不会被分割,而是作为索引为4的参数返回(或过程调用语法中的3)。如果用于out参数的索引与语句参数相同,则这意味着事实上,“?”是
    CallableStatement
    中允许的唯一“表达式”,甚至不包括作为参数的文字?文字和表达式可用于in参数,但仅用于in参数。对于out或in-out参数,您可以不要单独使用一个占位符。例如,如果您有
    {?=call myfunc(14987,'XYZ',?)}
    ,那么只有两个
    占位符。如果
    myfunc
    的前三个参数是IN参数,而最后一个是OUT参数,您将使用
    .registerOutParameter(2,…)
    设置最后一个输出参数。