2012-02-13 21 views
2

バリューJavaアプリケーションからOracleストアドプロシージャに多数の「不明な」値を渡したいと考えています。データは幾分構造化されているので、現在、データのキーと値のペアは2つのclobを受け付けるストアドプロシージャを持っています。最初のクロップは2番目のクロップの1つのレコードを表し、クロップ1の多くの子レコードを表します。Oracleストアドプロシージャ構造化パラメータ

これは、forst plaveでjavaの文字列を作成してからデータを渡す必要があるため、ストアドプロシージャで解析する必要があります。

私はOracleのレコード構造を調べましたが、レコード構造の各フィールドをdbテーブルフィールドにマッピングする必要があるように見えます。このアプローチの問題は、a)我々が毎回送るデータ項目が異なる(コア・データ・セットは同じであるにもかかわらず)があり、b)データ項目の中には、意思決定の目的でのみ存在し、実際にはないものがあるデータベースに保持されます。

私の質問は、Oracleのストアドプロシージャにそのようなデータを渡す最も効率的な方法は何ですか?我々は、可変パラメータセットを送ることができるという柔軟性を維持し、データの周りに幾分類似した構造を持つことを望む。

ありがとうございます。バリー

+1

あなたが以前の質問のいくつかから答えを受け入れるなら、私はあなたの答えを持っています! – tbone

+1

@tbone答えが受け入れられました。あなたの提案に感謝します:)最初に –

+0

はXMLTypeのラインに沿って考えていましたが、Lukasのコメントuはそのアプローチを拒否していました。 Oracleに渡す必要があるデータの例を挙げられますか? – tbone

答えて

3

あなたがXMLとしてストアドプロシージャにデータを渡すと考えたことがありますか? OracleはXML data typesを処理できます。スタックオーバーフロー上のいくつかの関連の質問もあります

しかし、XMLは、いくつかの状況では、パフォーマンスキラーかもしれません。別のオプションは、REF CURSOR型を使用することです:ややデータを構造化し、まだ弱い型付けされたカーソルを上の動作させるための方法だろう

PreparedStatement stmt = connection.prepareStatement(
    "DECLARE " 
    + " records SYS_REFCURSOR; " 
    + "BEGIN " 
    + " OPEN records FOR " 
    + " SELECT * FROM TABLE(?); " 
    + " my_proc(records); " 
    + "END;"); 

// Set the records as an array 
stmt.setArray(1, records); 

。上記の選択はどのような形式でも可能です。

CREATE TYPE rec AS OBJECT (ID NUMBER(7), VALUE CLOB); 
CREATE TYPE tab AS TABLE OF rec; 

TABLE OF VARCHAR2REF CURSOR期待して簡単な例の手順の実装:この例では、私はあなたがこのような何かを結合されることを仮定している結合

CREATE OR REPLACE PROCEDURE my_proc(cur IN SYS_REFCURSOR) IS 
    -- Using a pre-existing TABLE TYPE from the SYS schema for the example 
    array ORA_MINING_VARCHAR2_NT; 
BEGIN 
    FETCH cur BULK COLLECT INTO array; 

    FOR i IN array.FIRST .. array.LAST 
    LOOP 
    DBMS_OUTPUT.PUT_LINE(array(i)); 
    END LOOP; 
END; 

JDBCは、次のようになり

String[] strings = new String[] {"a", "b", "c"}; 
ArrayDescriptor desc = new ArrayDescriptor("ORA_MINING_VARCHAR2_NT", c); 
ARRAY array = new ARRAY(desc, c, strings); 
stmt.setArray(1, array); 
stmt.executeUpdate(); 

データタイプがTABLE OF OBJECTの場合、バインディングはもう少し複雑です...

+0

私はこれらのレコードの何千ものものを渡すと言わざるを得ないので、パフォーマンスが問題であり、私たちはこの理由でxmlを拒否しました。 –

+0

@BazR:そうです。おかげさまで、これはオプションかもしれません。 –

+0

私が推測する問題は、柔軟性のためにデータをわずかに非構造化したいが、妥当なレベルのパフォーマンスを維持しながら構造化された方法でデータを整理することです。だから私のケーキを持って食べる:) –

関連する問題