1

フロント エンドの .Net アプリケーションに複数のデータ セットを返す次のストアド プロシージャを作成しました。

create or replace PROCEDURE GET_EMPLOYEE_INFO 
(
  EMP_NO IN VARCHAR2,
  E_RECORD_SET1 OUT SYS_REFCURSOR,
  E_RECORD_SET2 OUT SYS_REFCURSOR,
  E_RECORD_SET3 OUT SYS_REFCURSOR,
  E_RECORD_SET4 OUT SYS_REFCURSOR
) AS 
BEGIN
  OPEN E_RECORD_SET1 FOR
    SELECT * FROM EMP.EMPLOYEES;

  OPEN E_RECORD_SET2 FOR
    SELECT * FROM EMP.CITIES;

  OPEN E_RECORD_SET3 FOR
    SELECT * FROM EMP.STATES;

  OPEN E_RECORD_SET1 FOR
    SELECT * FROM EMP.DURATION;

各クエリは、単独で正しく実行されます。ストアド プロシージャを実行すると、結果セットが表示されますが、すべてのデータがフェッチされているとは思えません。下部には、まだ「RUNNING IDE CONNECTION」と表示されています。

  • プロシージャはループしていますか?
  • 種類に制限はありSYS_REFCURSORますか?
  • これらのカーソルを閉じる必要がありますか?
4

1 に答える 1

0
  • 実際のストアド プロシージャが最後に欠落していないと思いますEND。投稿したコードはコンパイルされません。
  • あなたのストアドプロシージャもパラメータで何かをしていると思いEMP_NOます。
  • そして、それが数値であることを暗示する名前にもかかわらず、EMP_NO実際には文字列として宣言されていると思います。

すべてが真実であると仮定して

  • すべてのデータが取得されていないとなぜ思いますか?
  • 「一番下に、それはまだ言う」という文が指す「それ」とは何ですか? これはあなたの C# アプリケーションですか? あなたが乗る?他の何か?
  • が追加されてコンパイルされると仮定して、投稿したコードENDはループできません。コードは単にカーソルを開くだけで、SQL ステートメントを実行せず、データを生成しません。これは、クライアント アプリケーションがデータのフェッチを開始するまで発生しません。
  • SYS_REFCURSORこれは珍しい設計ですが、4 つのパラメーターを返すプロシージャーを持つことは構文的に完全に有効です。これは、カーソルからフェッチされるデータには影響しません。
  • はい、クライアント アプリケーションは、カーソルからすべてのデータをフェッチしたら、これらのカーソルを閉じる必要があります。
于 2012-07-19T21:21:28.647 に答える