0

2つの入力、2つの出力パラメータ、および5つのsys_refcursorsを持つストアドプロシージャがあります。別のストアドプロシージャを呼び出してこれらのカーソルを開いたIF/ELSEは成功しましたが、別のストアドプロシージャ呼び出しである3番目のオプションが必要になりました。3番目のオプションは、2番目のオプションと実質的に同じですが、1つの違いがあります。

ネストされたifステートメントが正しいことは確かでしたが、この新しい呼び出しからカーソルを取得しようとすると、ora-24338ステートメントハンドルが実行されないままになります。

問題のあるストアドプロシージャの呼び出しは真ん中のものです。

create or replace Procedure  procedure_name (
    OutVar out varachar2,
    Outvar2  out number,
    inParam1 date,
    REf-Cur1 in out sys_refcursor,
    REf-Cur2 in out sys_refcursor,
    REf-Cur3 in out sys_refcursor,
    REf-Cur4 in out sys_refcursor,
    REf-Cur5 in out sys_refcursor
) 
is
  tIsBindVar1 varchar2(100);
  tIsBindVar2 varchar2(100);
  tOutVar1    varchar2(100);
  TOutVar2    varchar2(100);
Begin
  Select Max(T.Var1) 
    into tIsBindVar1
    From table1 
   where T.aField = inParam1;

Select Function_Name (inParam1) 
  into tIsBindVar2 
  from Dual;

IF tIsBindVar1 is NOT NULL 
THEN
  Select P.Field_A P.Field_B 
    INTO tOutVar1, tOutVar2
    FROM table1 
  WHERE P.Field_A = inParam1;

  Stored_Proc_One (tInParam => tOutVar1, 
                   inParam1 => inParam1, 
                   5 cursors => 5 cursors);
ELSE 
  IF tIsBindVar2 = 'Y' 
  THEN
    Stored_Proc_Two (inParam1 => inParam1, 
                     5 cursors => 5 cursors);
  ELSE 
    Stored_Proc_Three ();
    Stored_Proc_Two ( inParam1 => inParam1, 5 cursors => 5 cursors);
  END IF;
END IF;

SELECT tOutVar1, tOutVar2 
  INTO OutVar1, OutVar2 
  FROM DUAL;

いくつかの簡単な追加のメモ。

Stored_procs 1と2は、まっすぐなデータグラブであり、特別なものではありません。ストアドプロシージャ3は、いくつかの入力パラメータ(リストされていません)に基づいてデータを生成し、ストアドプロシージャ2が呼び出されて収集されます。

これらのストアドプロシージャ呼び出しを変更することができ、常に真ん中の呼び出しから同じエラーが発生します。これには、条件を任意の順序で変更することも含まれます。

私は自分のために仕事をしてくれる人を探しているのではなく、問題が何であるかを理解しようとしているので、コードを単純化しようとしました。

うまくいけば、私は重要なことを何も残さなかったと思いますが、問題は私がネストされたifをどのように実行しているかにあると思います。私は確かにそうは思いません。順序を変更すると機能すると言っているので、ストアドプロシージャ自体に問題があるとは思いません。

したがって、長く曲がりくねっていて、コードを読むのが非常に難しい場合。彼らが編集情報を保持している場所を見つけて、それをクリーンアップしようとしています。

前もって感謝します。

4

1 に答える 1

1

tIsBindVar1との値は何tIsBindVar2ですか?

IFステートメントを私がフォーマットした方法で構造化する必要がありますか?それとも本当に欲しいですか

IF  tIsBindVar1 is NOT NULL 
THEN
  <<do something>>
ELSIF tIsBindVar2 = 'Y' 
THEN
  <<do something else>>
ELSE 
  <<do one more thing>>
END IF;

すべての場合に少なくとも1つのパスを確実にたどるには、が必要ですIF ELSIF ELSE

SELECT FROM dualちなみに、これらすべてのステートメントは必要ありません。PL/SQLで変数を割り当てるだけです

tIsBindVar2 := Function_Name (inParam1);

tOutVar1 := OutVar1;
tOutVar2 := OutVar2;

より一般的です。

于 2012-05-05T20:52:52.373 に答える