2010-12-03 57 views
1
StringBuffer sql = new StringBuffer("{ call ? := mailmerge_package.getLetters(?, ?, ?)}"); 

我知道這就像一個SQL語句,但沒有這樣的事情,在SQL中的'調用'。這是什麼意思? (java,數據庫)

有人能向我解釋這意味着什麼,它是如何來通過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); 
+1

我們需要上下文。我們不知道您使用的是什麼數據訪問技術。 – 2010-12-03 11:26:07

回答

3
{call <<procedure name>>} 

SQL escape sequence。基本上,由於不同的數據庫對於如何調用用戶定義的過程有不同的語法,而且不同的數據庫對於常見的日期/時間函數等各種內容具有不同的內置函數,所以JDBC驅動程序實現了許多轉義序列,其中驅動程序將泛型規範(即{call <<procedure name>>}),並將其擴展爲數據庫特定的語法。如果您嘗試編寫數據庫不可知的代碼,則可以使用外部連接,日期文本和字符串函數等其他各種轉義序列。這些轉義序列最初是在ODBC API中定義的,然後被JDBC採用,所以您可能會發現更多與ODBC相關的文檔而不是JDBC。

6

這看起來像SQL可以傳遞給甲骨文。

如果是這樣,那麼這可以用來調用一個返回值的Oracle函數mailmerge_package.getLetters。該值由JDBC和Db層解析以替換第一個?,這可以讀入Java變量。 Oracle函數需要3個參數(圓括號中的3?)

2

這是調用數據庫的存儲過程。但是從哪個數據庫中,我無法從這段代碼中看出來。