2012-03-03 23 views
2

新手問題...任何人都可以提供所需要的東西在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)?

回答

4

如果你想從Oralce的PL/SQL程序使用REF光標返回結果集:

http://www.oracle-base.com/articles/misc/UsingRefCursorsToReturnRecordsets.php

Q1:是的,它看起來不錯,但我還沒有測試它。 Q2: 我相信OracleCallableStatement只是延伸的CallableStatement。兩者都很好,但是我儘可能使用Oracle驅動程序來連接和使用Oracle數據庫(而不是某些通用驅動程序)。

Q3:我相信你是正確的,並光標停留時打開關閉ResultSet。(它一直以來,我讀了過程結果,所以我不記得我關閉遊標對不起一段時間。而現在,我在家裏沒有訪問Oracle數據庫和我的工作電腦。)

+0

謝謝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

+0

@ggkmath你想出了什麼:)。 – elrado 2012-03-04 13:16:19

+0

嗨,elrado,我第一次嘗試它,它工作正常。感謝上面關於ref cursor的提示,我能夠取得這一進展。感謝您花時間提交答案!它真的幫了我很多! – ggkmath 2012-03-04 20:54:22