2012-01-02 33 views
1

複数のカーソルを1つのプロシージャに戻したい。PLSQL:複数のカーソルを出力するプロシージャ

私は、現在のコードは次のとおりです。

TYPE REFCURSOR IS REF CURSOR; 

PROCEDURE GETCARS(oCARS OUT REFCURSOR) 
BEGIN 
    OPEN oCARS FOR SELECT * FROM CARS; 
END GETCARS; 

私はそれがかのうだかはわからないが、私のようなものを作りたい:

2番目のパラメータとしてに接続されたすべての修理を返します
PROCEDURE GETCARS(oCARS OUT REFCURSOR, oREPAIRS OUT REFCURSOR) 
BEGIN 
    OPEN oCARS FOR SELECT * FROM CARS; 
    ..??.. 
END GETCARS; 

現在フェッチされたoCARS行。 (表の修理が車からid_carためのFKを持っている)

今、私はoCARSカーソルから1行をフェッチする際に、C#の側に私は私の修理のリストを与える二プロシージャを呼び出すが、多分それは何とかすることができますことをやります1つの手順でそれを行う(私のパフォーマンスの向上を与えるだろう - ?私はそれが各修理のための乗算車を返す原因、結合を使用したくない)

+0

なぜ2つの手順(getcarsとgetrepairs)がないのですか?また、必要なときに必要なものを選択するだけです。exec getcars()の代わりに* from carsを選択してください。 – tbone

+0

コールプレーンの選択が安全でなく、パラメータ化されたプロシージャ(SQLインジェクション保護)を呼び出しています。 私は、2プロシージャを呼び出すほうが効率が悪いと考えています。ここでは、他の人の経験を期待しています。 –

+1

正しくパラメータ化されたselectステートメントを呼び出すことは、プロシージャを呼び出すよりも安全です。 selectステートメントにパラメーター値を連結しない限り、SQLインジェクションのベクトルはありません。 – Allan

答えて

1

簡単な答えは、試していることをすることができないということです。

カーソルは、基本的に、クエリ結果を含む結果セットの先頭へのポインタです。行を取得するまで、その行に含まれる内容を知る方法はありません。 PL/SQLコードではなくアプリケーションがフェッチを実行しているため、PL/SQLの部分では戻される値は認識されません。

データベースは、最初のクエリからフェッチを検出し、2番目のクエリを使用して新しい結果セットを作成し、そのプロシージャが最初に返すアドレスに新しい結果セットを配置する必要があります2番目のカーソルデータベースはこの種の操作を処理するようには設計されていません。

2

どの程度

PROCEDURE GETCARS(oCARS OUT SYS_REFCURSOR, oREPAIRS OUT SYS_REFCURSOR, oCHARGES OUT SYS_REFCURSOR) 
BEGIN 
    OPEN oCARS FOR SELECT * FROM CARS; 
    OPEN oREPAIRS FOR SELECT * FROM REPAIRS; 
    OPEN oCHARGES FOR SELECT * FROM CHARGES; 
END GETCARS; 

シェアをお楽しみください。

+0

私はすべてのoCarsを返すときは、それは良い、ほとんど良いです。 しかし、私はいくつかのフィールドにページ制限や日付制限のためのいくつかの余分なコードを追加すると、残りのカーソルは私が必要以上に返すだろう。 私は、oCarsで現在フェッチされた行のIDにバインドし、それに基づいてoRepairsを戻すように修正することができます。 何かのように: OPEN o修復から選択*修復からどこid_car = ocars.id_car 私はそれが可能かどうかは分かりません。 –

+2

@XXs - この "はい、しかし" schtickで人々の時間を無駄にするのではなく、*あなたの要件全体*を書き留めてみませんか? – APC

+0

"現在フェッチされたoCARS行に接続されたすべての修復を2番目のパラメータとして返す読み方を学びます。"はい、私はDB全体をカーソルで返すことでパフォーマンスを向上させたいと思っていました.. -.- ここで質問すると、私は拡張可能な解決策を求めています。 –

関連する問題