2009-08-31 1 views
2

Oracleでストアドプロシージャを作成しましたが、Javaコードで起動します。 問題について説明します。JavaストアドプロシージャをJavaコードで起動します。

TYPE PERSON_TYPE AS OBJECT (ID NUMBER(38), NAME VARCHAR2(20)); 

とテーブルタイプ:

TYPE PERSON_TYPE_TABLE AS TABLE OF PERSON_TYPE; 

私の手順は次のようになります。

PROCEDURE EVALUATE_PERSON_PROC(P_PERSON_ID IN NUMBER, return_data OUT NOCOPY PERSON_TYPE_TABLE) 
AS 
--Some code 
BEGIN 
--Some code 
END; 

どのようにJavaコードでは、この手順を起動する私は、オブジェクトの種類がありますか?どのクラスがそれを行うのに最適ですか?

答えて

8

あなたはCallableStatement classを使用する必要があります。

String sql = "{call EVALUATE_PERSON_PROC(?, ?)}"; 
CallableStatement statement = connection.prepareCall(sql); 
... 
statement.execute(); 
+1

+1。私はまた、作者が返すテーブルの種類についていくつかのドキュメントが必要と思われる:http://stackoverflow.com/questions/1031420/returning-a-table-type-from-a-plsql-function-called-via-jdbc –

+0

はい、私はそれを知っている。しかし、私がPL/SQLで作成した私のタイプはどうしていますか? 私のタイプのコレクションを返すCallableStatementを設定するには? –

8

Spring's DAO abstraction(定型的なコードの必要性を排除し、生のJDBCの周りに非常に有用であると合理的に軽量ライブラリ)を使用しないのはなぜあなたがStoredProcedureクラスをサブクラス化することができます。

class MySproc extends StoredProcedure { 
    public MySproc(DataSource ds) { 
     super(" { exec MY_SPROC ?, ? }", ds); 
     declare(new SqlParameter("p1", Types.VARCHAR)); 
     declare(new SqlParameter("p2", Types.INT)); 
    } 

    public void execute(String p1, int p2) { 
     Map m = new HashMap(); 
     m.put("p1", p1); 
     m.put("p2", p2); 
     super.execute(m); 
    } 
} 

そしてこれは次のように非常に簡単に実行される:なしデータベースConnection Sに

new MySproc(ds).execute("Hello", 12); 

を、CallableStatement sはどこでも見られるように。美しい!はい、また、アノテーションベースのTransactionを提供しています。

sprocがテーブルを返す場合、これはSpringを使用すると非常に簡単です。単に宣言:

mapper
 declare(new SqlReturnResultSet("rs", mapper)); 

が所望のオブジェクトにResultSetのラインに変換インスタンスです。

 Map out = super.execute(m); 
     return (Collection) out.get("rs"); 

返さCollectionがあなたのmapper実装によって作成されたオブジェクトのインスタンスが含まれます。その後、あなたの行を変更します。

+0

トップスタッフ...... – toolkit

+0

おそらくこのようなステートメントのために、プロジェクトにスプリングライブラリを導入するのはナンセンスです。また、この作成者がSpringをOracle DBMSに直接配備することを決定するシナリオもあります。ここでは、Springには多くの苦労があります。 –

関連する問題