2017-04-30 4 views
1

私はこれを全面的に見て答えを見つけることはできません。既に投稿されている場合は、その方向で私を指摘してください。REFCURSOR型の変数をJavaのOracleストアドプロシージャに送信

Javaから呼び出す必要があるOracleストアドプロシージャがあります。このSPはREFCURSOR型をINパラメータとして求めます(REFCURSORを返さなければなりません)。

私はCallableStatementのとStmt.registerOutParameter(3、OracleTypes.CURSORを使用してSP()からの応答としてREFCURSORを受信する方法を知っている;例えばこれは私が欲しいものではありません

私はcan'。 SPへのパラメータとしてのJava

-sendそれで-create REFCURSOR

:T(...悲しいことに十分な)

をSPを変更し、私はにサンプルコードが必要です。

Thxは、提供されたヘルプをたくさん提供しています。

+0

'REFCURSOR'は行と列のセットではなく、データベースがクエリを格納しているメモリ位置(場合によってはいくつかの行と列)へのポインタです。したがって、Javaでは 'REFCURSOR'を作成することはできません。それはデータベースで行われなければなりません。 – MT0

答えて

0

Oracle Documentationから:REF CURSOR Sを使用してREF CURSOR

はじめは、クライアント・アプリケーションにOracleデータベースからクエリ結果を返すために最も強力かつ柔軟、かつスケーラブルな方法の一つです。

REF CURSORは、値がデータベース上のクエリ作業領域のメモリアドレスであるPL/SQLデータ型です。本質的に、REF CURSORは、データベース上の結果セットのポインタまたはハンドルです。 REF CURSORは、OracleRefCursor ODP.NETクラスで表されます。

REF CURSOR Sは、以下の特性を有する:

  • REF CURSORは、データベース上のメモリアドレスを参照します。したがって、アクセスするには、クライアントをREF CURSORの存続期間中にデータベースに接続する必要があります。

  • REF CURSORには、追加のデータベース往復が含まれます。 REF CURSORがクライアントに返される間、クライアントがREF CURSORを開いてデータを要求するまで、実際のデータは返されません。ユーザーがデータを読み取ろうとするまで、データは取り出されないことに注意してください。

  • REF CURSORは更新できません。 REF CURSORで表される結果セットは読み取り専用です。 REF CURSORを使用してデータベースを更新することはできません。

  • REF CURSORは後方スクロールできません。 REF CURSORによって表されるデータは、順方向のみで連続してアクセスされます。 REF CURSOR内のレコードポインタを、結果セット内のランダムレコードを指すように配置することはできません。

  • REF CURSORは、PL/SQLデータ型です。 PL/SQLコード・ブロック内にREF CURSORを作成して戻します。

だから、あなたはJavaでREF CURSORを作成することはできません。代わりにデータベースに作成し、Javaアプリケーションに渡してから、呼び出し元のプロシージャに戻す必要があります(またはデータベース内ですべて実行する必要があります)。

+0

こんにちは、thxレスポンスです。したがって、基本的に、Java invoque PL/SQLからテーブルを作成し、それを記入して、カーソルを送り返します。これまでは、(話すことで...)かなり明確でした。 Oracleストアド・プロシージャにカーソルを送信する方法はまだ分かりません。 –

-1

REFカーソルはOracleタイプであり、PL/SQL以外では作成できません。私はあなたが望むものは、参照カーソル型を含むストアドプロシージャを呼び出すために、Javaのカーソル型です。次のリンクをクリックすると、OracleのOracle8i JDBC開発者ガイドおよびリファレンスのドキュメントが表示されます。カーソル(REF Cursor)パラメーターを使用してストアード・プロシージャーを呼び出す方法のサンプルが含まれています。具体的な行は次のとおりです。

call.registerOutParameter (1, OracleTypes.CURSOR); 

JDBCを使用しているかどうかはわかりませんが、Javaの実装にも適用される場合があります。

+0

こんにちは、そしてあなたの回答はthxです。はい、call.RegisterOutParameterはPL/SQLからカーソルをRECIEVEすることです。私はSPにカーソルを送信する必要があります(または、私は非常に単純なコンセプトに欠けているかもしれません)。 Thx再びあなたの助けになります。 –

+0

あなたがしたいことが分かりました。カーソルを使用して、ストアドプロシージャにある型のデータセット/テーブルを送信したいとします。まあ、あなたはクライアント側でそれをすることはできません。私はあなたがデータセット/テーブルを通過するループを作成し、一度に1つずつストアドプロシージャに各行のデータ列値を送信することをお勧めします。基本的には同じことですが、クライアント上ではCPUサイクルのコストがかかります。私はjavaでコード化していませんが、あなたがそれが助けになると思うなら、それをするいくつかのVBコードを持っています。 –

関連する問題