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

时间:2010-12-03 11:21:41

标签: java database oracle

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

3 个答案:

答案 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)

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