这是什么意思?(java,数据库)

这是什么意思?(java,数据库),java,database,oracle,Java,Database,Oracle,我知道这类似于sql语句,但sql中没有“call”这样的东西 有人能给我解释一下它的意思吗?Java是如何理解它的 编辑: 这看起来像是可以传递给Oracle的SQL 如果是这样,则可以使用此函数调用Oracle函数mailmerge_package.getLetters,该函数返回一个值。该值由JDBC和Db层解析以替换第一个?值,该值可以读入Java变量。Oracle函数接受3个参数(括号中的3个参数)这看起来像是可以传递给Oracle的SQL 如果是这样,则可以使用此函数调用Oracle

我知道这类似于sql语句,但sql中没有“call”这样的东西

有人能给我解释一下它的意思吗?Java是如何理解它的

编辑:


这看起来像是可以传递给Oracle的SQL


如果是这样,则可以使用此函数调用Oracle函数mailmerge_package.getLetters,该函数返回一个值。该值由JDBC和Db层解析以替换第一个?值,该值可以读入Java变量。Oracle函数接受3个参数(括号中的3个参数)

这看起来像是可以传递给Oracle的SQL


如果是这样,则可以使用此函数调用Oracle函数mailmerge_package.getLetters,该函数返回一个值。该值由JDBC和Db层解析以替换第一个?值,该值可以读入Java变量。Oracle函数接受3个参数(括号中的3个参数)

它是对数据库存储过程的调用。但从这段代码中我无法分辨是哪个数据库。

它是对数据库存储过程的调用。但是从这段代码中我无法分辨是哪个数据库。

{call}
import oracle.jdbc.driver.OracleTypes;
//omitted code
CallableStatement cs = null;
        ResultSet rs = null;
     StringBuffer sql = new StringBuffer("{ call ? := mailmerge_package.getLetters(?, ?, ?)}");
 try {
            cs = conn.prepareCall(sql.toString());
            cs.registerOutParameter(1, OracleTypes.CURSOR);
            DAOUtils.setLong(cs, 3, checklistAnsMastId);
            DAOUtils.setLong(cs, 2, workEntityId);
            cs.setLong(4, patientId);
            DAOUtils.setLong(cs, 5, encounterId);
            cs.setString(6, encounterType);
            cs.execute();
            rs = (ResultSet)cs.getObject(1);
这是一个很好的例子。基本上,由于不同的数据库对于如何调用用户定义的过程具有不同的语法,并且不同的数据库对于诸如通用日期/时间函数之类的各种事情具有不同的内置函数,因此JDBC驱动程序实现了许多转义序列,驱动程序在其中转换通用规范(即
{call}
)并将其扩展为特定于数据库的语法。对于外部联接、日期文字和字符串函数等,还有各种其他转义序列,如果您试图编写与数据库无关的代码,这些转义序列可能会很有用

仅供参考,这些转义序列最初是在ODBC API中定义的,然后被JDBC采用,因此您可能会找到比JDBC更多的与ODBC相关的文档。

{call}
这是一个很好的例子。基本上,由于不同的数据库对于如何调用用户定义的过程具有不同的语法,并且不同的数据库对于诸如通用日期/时间函数之类的各种事情具有不同的内置函数,因此JDBC驱动程序实现了许多转义序列,驱动程序在其中转换通用规范(即
{call}
)并将其扩展为特定于数据库的语法。对于外部联接、日期文字和字符串函数等,还有各种其他转义序列,如果您试图编写与数据库无关的代码,这些转义序列可能会很有用


仅供参考,这些转义序列最初是在ODBC API中定义的,然后被JDBC采用,因此您可能会找到比JDBC更多的与ODBC相关的文档。

我们需要上下文。我们不知道您使用的是什么数据访问技术。@user521180:这不是数据访问技术,而是存储技术。您已经发布了创建StringBuffer的代码,但没有说明如何使用它。我从类中添加了更多代码。看看Oracle SQL中有调用,我们需要上下文。我们不知道您使用的是什么数据访问技术。@user521180:这不是数据访问技术,而是存储技术。您已经发布了创建StringBuffer的代码,但没有说明如何使用它。我从类中添加了更多代码。看看Oracle SQL中有调用
import oracle.jdbc.driver.OracleTypes;
//omitted code
CallableStatement cs = null;
        ResultSet rs = null;
     StringBuffer sql = new StringBuffer("{ call ? := mailmerge_package.getLetters(?, ?, ?)}");
 try {
            cs = conn.prepareCall(sql.toString());
            cs.registerOutParameter(1, OracleTypes.CURSOR);
            DAOUtils.setLong(cs, 3, checklistAnsMastId);
            DAOUtils.setLong(cs, 2, workEntityId);
            cs.setLong(4, patientId);
            DAOUtils.setLong(cs, 5, encounterId);
            cs.setString(6, encounterType);
            cs.execute();
            rs = (ResultSet)cs.getObject(1);
{call <<procedure name>>}