嵌套if语句返回语句句柄未执行错误

时间:2012-05-05 20:37:34

标签: oracle stored-procedures if-statement plsql

我有一个存储过程,有两个输入,两个输出参数和5个sys_refcursors。 我有一个成功的IF / ELSE,我通过调用不同的存储过程打开这些游标,但现在需要第三个选项,这是另一个存储过程调用。第三种选择实际上与第二种选择完全相同,但有一点不同。

我很确定我的嵌套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一个和两个是直接数据抓取,没有什么花哨,存储过程3根据一些输入参数(未列出)生成一些数据,并且存储过程2被调用来收集。

我可以更改这些存储的proc调用,我总是从中间调用同样的错误。这包括以任何顺序改变条件。

我试图简化代码,因为我不是在寻找任何人为我做这项工作,而是试图了解问题是什么。

希望我没有留下任何重要的东西,但我认为这个问题与我如何做嵌套if。我当然不会认为问题存在于存储过程中,因为我说它们在我改变订单时起作用。

因此,如果长时间啰嗦并且很难阅读代码。试着找到他们保存编辑信息的位置并进行清理。

提前致谢。

1 个答案:

答案 0 :(得分:1)

tIsBindVar1tIsBindVar2的价值是多少?

你真的希望IF语句按照我格式化的方式构建吗?或者你真的想要

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

如果您想确保在所有情况下都遵循至少一条路径,则需要IF ELSIF ELSE

顺便说一下,不需要所有这些SELECT FROM dual语句。您只需在PL / SQL

中分配变量即可
tIsBindVar2 := Function_Name (inParam1);

tOutVar1 := OutVar1;
tOutVar2 := OutVar2;

更传统。