2011-01-18 16 views
6

こんにちは、私はOracleのストアドプロシージャ休止状態でストアドプロシージャを呼び出す方法は?

GET_VENDOR_STATUS_COUNT(DOCUMENT_ID IN NUMBER , NOT_INVITED OUT NUMBER,INVITE_WITHDRAWN OUT NUMBER,... 

残りを持っているすべてのパラメータはOUTパラメータです。私が書いたHBMファイルで

- Javaで

<sql-query name="getVendorStatus" callable="true"> 
    <return-scalar column="NOT_INVITED" type="string"/> 
    <return-scalar column="INVITE_WITHDRAWN" type="string"/> 
    <return-scalar column="INVITED" type="string"/> 
    <return-scalar column="DISQUALIFIED" type="string"/> 
    <return-scalar column="RESPONSE_AWAITED" type="string"/> 
    <return-scalar column="RESPONSE_IN_PROGRESS" type="string"/> 
    <return-scalar column="RESPONSE_RECEIVED" type="string"/> 
    { call GET_VENDOR_STATUS_COUNT(:DOCUMENT_ID , :NOT_INVITED ,:INVITE_WITHDRAWN ,:INVITED ,:DISQUALIFIED ,:RESPONSE_AWAITED ,:RESPONSE_IN_PROGRESS ,:RESPONSE_RECEIVED) } 
    </sql-query> 

を私が書かれている -

session.getNamedQuery("getVendorStatus").setParameter("DOCUMENT_ID", "DOCUMENT_ID").setParameter("NOT_INVITED", "NOT_INVITED") 

...すべてparametesまで継続します。

私は

 
    18:29:33,056 WARN [JDBCExceptionReporter] SQL Error: 1006, SQLState: 72000 
    18:29:33,056 ERROR [JDBCExceptionReporter] ORA-01006: bind variable does not exist 

は私が休止状態からストアドプロシージャを呼び出すの正確なプロセスが何であるかを教えてくださいSQL例外を取得しています。私はJDBCの呼び出し可能なステートメントを使用したくありません。

+0

ストアドプロシージャと制限の使用について[公式ドキュメント](http://docs.redhat.com/docs/en-US/JBoss_Enterprise_Web_Platform/5/html/Hibernate_Core_Reference_Guide/sp_query.html)を参照してください(http ://docs.redhat.com/docs/en-US/JBoss_Enterprise_Web_Platform/5/html/Hibernate_Core_Reference_Guide/sp_query.html) –

答えて

1

Hibernateでは、結果クラスを適用してSPの結果を変換する必要があり、返される列の名前は、結果クラスの正しい戻りフィールドに別名を付ける必要があります。 Hibernateは、SQLServerに格納されたprocsに1つの戻り値を持たせ、作成するオブジェクトの種類を知りたいとします。私が働いているところでは、通常、return_codeとmessageという2つの列からなる1行の結果を返します。例えば

...

  • RETURN_CODE = 404、メッセージ= "ページが見つかりません"

  • RETURN_CODE = 200、メッセージ= "OK"

クラス他のPOJOと同じようにマップされますが、必ずSerializeableにしてください。たとえば:

@Entity 
public class StoredProc implements Serializable { 

    private Integer returnCode; 
    private String message; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "return_code", nullable = false, unique = true) 
    public Integer getReturnCode() { 
    return returnCode; 
    } 
    public void setReturnCode(Integer returnCode) { 
    this.returnCode = returnCode; 
    } 

    @Column(name = "message") 
    public String getMessage() { 
    return message; 
    } 
    public void setMessage(String message) { 
    this.message = message; 
    } 

} 

私はまた、Hibernateが使用する命名規則に関しては、いくつかの一般的なhokeynessを思い出すように見えます。私はnames_with_underscoresがcamelCaseFieldNamesに変換されると思います。

5

4.1(INOUT/OUTパラメータ処理)は、4.1ではサポートされていません。 4.1までHibernateの呼び出し可能ステートメントサポートは、ResultSetの戻り値に焦点を当てています。上流のマスターで既に何をしようとしているのかをサポートしています。これは、Hibernateの次のメジャーリリースの一部(4.2または5.0のいずれか)になります。そこでは、呼び出し関数/プロシージャが第一級の操作になりました。

今のところ、JDBCを直接使用するか、マスターからHibernateを構築して、その新しいサポートを使用する必要があります。後で選択すると、次のようになります。

StoredProcedureCall call = session.createStoredProcedureCall("GET_VENDOR_STATUS_COUNT") 
     .registerStoredProcedureParameter("DOCUMENT_ID", Long.class, ParameterMode.IN) 
     .registerStoredProcedureParameter("NOT_INVITED", String.class, ParameterMode.OUT) 
     ...; 
call.getRegisteredParameter("DOCUMENT_ID").bindValue(theDocumentId); 
StoredProcedureOutputs outputs = call.getOutputs(); 
String notInvited = (String) outputs.getOutputParameterValue("NOT_INVITED"); 
... 

コードはまだ若く、変更される可能性があります。たとえば、これらの例をもっと頻繁に書くと、registerStoredProcedureParameterregisterParameterまたはdeclareParameterと改名され、宣言/登録の型付き表現が返されるはずです。

できるように、その後う
interface RegisteredParameter<T> { 
    Class<T> getParameterType(); 
    // only valid for IN or INOUT params 
    void bindValue(T value); 
} 

<T> RegisteredParameter<T> registerParameter(String name, Class<T> type, ParameterMode mode); 

:追加ボーナスとして

StoredProcedureCall call = session.createStoredProcedureCall("GET_VENDOR_STATUS_COUNT") 
call.registerParameter("DOCUMENT_ID", Long.class, ParameterMode.IN).bindValue(theDocumentId); 
RegisteredParameter<String> notInvitedParam = call.registerParameter("NOT_INVITED", String.class, ParameterMode.OUT); 
... 
String notInvited = outputs.getOutputParameterValue(notInvitedParam); 

を、これを試す人が早期これは前にそれが解放されるのにどのように見えるかを形作る助けてもらう(これをその時点でのようなもの変更するのがはるかに難しい)。

+0

現在、INOUT/OUTパラメータ処理がサポートされていないことについて私は明確にする必要があります。実際にはINOUT/OUTパラメータを持つことができ、ResultSetsを返すだけで、1つの呼び出しで結果を返すパラメータは1つだけにすることができます。 –

+0

答えに提供された情報をありがとう、上記の機能は、最新の休止状態バージョン(4.3.6)で利用可能と思われます。ストアドプロシージャが1つの結果セットを返すときには完璧に機能しますが、複数の結果セットに問題がある場合は、上記の機能ドキュメントのURLを指摘してください。私はGoogleで見つけることができません。 –