新手問題...任何人都可以提供所需要的東西在PL/SQL存儲過程來完成(駐留在數據庫Linux服務器)將數據發送到一個Java程序(應用服務器)的高層次的描述?在Linux上使用JDBC從Java中間層調用Oracle PL/SQL存儲過程?
更新1
下面elrado的回答讓我感動着(謝謝!)。我可以看到,PL/SQL存儲過程只需要將OUT參數設置爲REF CURSOR(例如SYS_REFCURSOR)。然後,調用Java例程可以使用這樣的事情:
import oracle.jdbc.*;
...
// call stored procedure using SQL92 syntax
CallableStatement cs = conn.prepareCall("{call myStoredProc (?,?,?,?,?)}");
// set IN parameters
cs.setString(1, in1var);
cs.setString(2, in2var);
cs.setString(3, in3var);
// register OUT parameters
cs.registerOutParameter(4, Types.VARCHAR);
cs.registerOutParameter(5, OracleTypes.CURSOR);
// execute and retrieve Oracle "ref cursor" as a Java "ResultSet"
cs.execute();
rs = (ResultSet) cs.getObject(5);
// process result
while (rs.next()) {
...
}
// always retrieve ResultSet before OUT parameters
out1var = cs.getInt(4);
問題1:以上看起來好嗎?
我的Oracle文檔中看到(見頁4-14 4-15 http://isu.ifmo.ru/docs/doc112/java.112/e10589.pdf),我應該使用OracleCallableStatement
代替CallableStatement
所以它應該是這樣的:
// execute and retrieve Oracle "ref cursor" as a Java "ResultSet"
cs.execute();
rs = {(OracleCallableStatement)cs}.getCursor(5);
問題2:是否兩種方法都很好?如果是這樣,那麼專業人士和騙子的使用方法是什麼?
問題3:我不瞭解Important
注第4-15頁的關於甲骨文11g數據庫:
Unlike in past releases, the cursor associated with a REF CURSOR is not closed when the result set object in which the REF CURSOR was materialized is closed.
這是否意味着,當cs
被關閉ref cursor
被關閉(而不是以前的數據庫版本,當rs
已關閉時關閉ref cursor
)?
謝謝elrado。這很混亂。一些例子,比如上面的鏈接,使用'execute()'語句,帶有OracleCallableStatement和getCursor。其他鏈接不使用'裁判cursor',但使用'的executeQuery()'聲明,與CallableStatement的(見最後一節在此鏈接:http://docs.oracle.com/javase/tutorial/jdbc/basics/storedprocedures的.html#calling_javadb_mysql還有:http://www.java2s.com/Code/Java/Database-SQL-JDBC/StoredprocedurewithInputOutputparmsandaResultSet.htm)。還有一些例子使用'ref cursor'和'executeQuery()'語句,用CallableStatement和getObject()。 – ggkmath 2012-03-04 00:48:15
@ggkmath你想出了什麼:)。 – elrado 2012-03-04 13:16:19
嗨,elrado,我第一次嘗試它,它工作正常。感謝上面關於ref cursor的提示,我能夠取得這一進展。感謝您花時間提交答案!它真的幫了我很多! – ggkmath 2012-03-04 20:54:22