StringBuffer sql = new StringBuffer("{ call ? := mailmerge_package.getLetters(?, ?, ?)}");
我知道它就像一个sql语句,但在SQL中没有'call'这样的东西。
有人可以向我解释它的含义以及Java如何理解它
编辑:
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);
答案 0 :(得分:6)
这看起来像是可以传递给Oracle的SQL。
如果是这样,那么这可以用来调用返回值的Oracle函数mailmerge_package.getLetters。该值由JDBC和Db层解析以替换第一个?,这可以读入Java变量。 Oracle函数有3个参数(括号中的3?)
答案 1 :(得分:3)
{call <<procedure name>>}
是SQL escape sequence。基本上,由于不同的数据库具有不同的语法来调用用户定义的过程,并且不同的数据库具有不同的内置函数,用于各种事物,如常见的日期/时间函数,JDBC驱动程序实现了许多转义序列,其中驱动程序转换为通用规范(即{call <<procedure name>>}
)并将其扩展为特定于数据库的语法。对于外连接,日期文字和字符串函数等各种其他转义序列,如果您尝试编写与数据库无关的代码,这些转义序列可能很有用。
仅供参考,这些转义序列最初在ODBC API中定义,然后由JDBC采用,因此您可以找到更多与ODBC相关的文档,而不是JDBC。
答案 2 :(得分:2)
调用数据库的存储过程。但是哪个数据库,我无法从这段代码中分辨出来。