2012-03-03 8 views
2

初心者質問...(アプリケーション・サーバー内の)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をしていますか?私はそれが次のようになりますように、私が代わりにCallableStatementOracleCallableStatementを使用する必要があること(ページ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を閉じましたか?

答えて

4

カーソルREF OralceのPL/SQLプロシージャの使用から結果セットを返すようにしたい場合:

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

Q1:はい、それはOKに見えますが、私はそれをテストしていませんでした。 Q2: 私は、Oracle CallableStatementは単にCallableStatementを継承しています。どちらも問題ありませんが、可能な限りOracleドライバを使用して、Oracle db(一部の汎用ドライバではありません)に接続して作業しています。

Q3:正しい結果が得られました。また、結果セットを閉じるとカーソルは開いたままです。(プロシージャの結果セットを読んでからしばらくして、残念ながらカーソルを閉じたときは覚えていません。そして、今は自宅にいるので、Oracleデータベースと私の仕事用コンピュータにアクセスできません)

+0

ありがとう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

+0

@ggkmathあなたは何を思いついたのですか?) – elrado

+0

こんにちは、私は初めてこれを試しましたが、うまくいきました。上記のカーソルのヒントのおかげで、私はこの進歩を遂げることができました。答えを提出する時間をとってくれてありがとう!それは本当に私を助けました! – ggkmath

関連する問題