初心者質問...(アプリケーション・サーバー内の)Javaプログラムにデータを送信するために、PL/SQLストアード・プロシージャー(データベースLinuxサーバーに常駐するもの)で実行する必要があることについて、以下Linux上でJDBCを使用してJava中間層からOracle PL/SQLストアド・プロシージャをコールしますか?
UPDATE 1
elradoの答えは、前方(感謝を!)私を動かしました。 PL/SQLストアド・プロシージャは、OUTパラメータをREF CURSOR(SYS_REFCURSORなど)として設定するだけで済みます。
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);
QUESTION 1:その後、呼び出し元のJavaルーチンは、このようなものを使用することができます上記のルックOKをしていますか?私はそれが次のようになりますように、私が代わりにCallableStatement
のOracleCallableStatement
を使用する必要があること(ページ4-15 http://isu.ifmo.ru/docs/doc112/java.112/e10589.pdfに4-14を参照)Oracleのドキュメントで見
:
// execute and retrieve Oracle "ref cursor" as a Java "ResultSet"
cs.execute();
rs = {(OracleCallableStatement)cs}.getCursor(5);
はQUESTION 2:です両方の方法はいいですか?そうであれば、プロとコンの両方を使って何を使うのですか?
質問3:私は、Oracle 11gデータベースに関する4-15ページImportant
注意を理解していなかった。
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。ややこしい。上のリンクのようないくつかの例では、OracleCallableStatementとgetCursorを使用して 'execute()'文を使用しています。他のリンクは 'ref 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)。さらに、他の例では、 'executeQuery()'ステートメントでCallableStatementとgetObject()を使って 'ref cursor'を使います。 – ggkmath
@ggkmathあなたは何を思いついたのですか?) – elrado
こんにちは、私は初めてこれを試しましたが、うまくいきました。上記のカーソルのヒントのおかげで、私はこの進歩を遂げることができました。答えを提出する時間をとってくれてありがとう!それは本当に私を助けました! – ggkmath