Java 为什么JDBC对存储过程的调用会将调用用花括号括起来?

Java 为什么JDBC对存储过程的调用会将调用用花括号括起来?,java,jdbc,Java,Jdbc,从Java中,我们可以执行以下操作: stmt.execute(“从用户中选择*) 但对于以下存储过程: stmt.execute(“{CALL createUser(?,,,?)}”) 当正常SQL中不需要时,为什么我们需要{和}呢?大括号是存储过程的转义语法。当JDBC驱动程序遇到{call createUser(?,,,?)}时,它会将此转义语法转换为数据库用来调用存储过程的本机SQL。JDBC是从ODBC派生的。 实际上,第一个jdbc驱动程序是jdbc到odbc的桥。 因此,使用ODB

从Java中,我们可以执行以下操作:
stmt.execute(“从用户中选择*)
但对于以下存储过程:
stmt.execute(“{CALL createUser(?,,,?)}”)


当正常SQL中不需要时,为什么我们需要
{
}
呢?

大括号是存储过程的转义语法。当JDBC驱动程序遇到
{call createUser(?,,,?)}
时,它会将此转义语法转换为数据库用来调用存储过程的本机SQL。

JDBC是从ODBC派生的。 实际上,第一个jdbc驱动程序是jdbc到odbc的桥。 因此,使用ODBC语法是有意义的。 大括号本身表示函数调用,存储过程基本上是用户
已定义函数,因此它们用大括号括起来。

以下是关于JDBC转义语法的官方文档:

以及一些特定于供应商的说明:


大括号还用于逃避通用函数定义(如JDBC规范中所列,带有禁止的参数和顺序)。驱动程序随后将其转换为特定于数据库的函数调用。值得一提的是,大括号可用于函数调用以外的其他用途,例如to(日期和时间)文本。例如,
{d'2014-07-03'}
关于这个问题的后续问题,使用大括号和不使用大括号有什么区别,有时当我不使用大括号时,结果中的垃圾数据会出现在记录类型中,当我使用大括号时,它会得到修复。