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

Posted

技术标签:

【中文标题】嵌套 if 语句返回语句句柄未执行错误【英文标题】:Nested if statement is returning a statement handle not executed error 【发布时间】:2012-05-05 20:37:34 【问题描述】:

我有一个带有两个输入、两个输出参数和 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 1 和 2 是直接抓取数据,没什么花哨的,stored_proc 3 根据一些输入参数(未列出)生成一些数据,然后调用 stored proc 2 进行收集。

我可以更改这些存储的 proc 调用,但我总是会从中间那个错误中解脱出来。这包括以任何顺序更改条件。

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

希望我没有遗漏任何重要内容,但我认为问题在于我如何执行嵌套 if。我当然不认为问题出在存储过程本身,因为我说当我更改订单时它们会起作用。

因此,如果冗长且难以阅读代码。将尝试找到他们保存编辑信息的位置并进行清理。

提前致谢。

【问题讨论】:

添加贾斯汀所说的 Stored_Proc_Three (); 是不正确的。它应该是Stored_Proc_Three;(没有括号,因为没有参数)。 问题已解决。谢谢 Ben,那是真的.. 我只是在写出来的时候进入了 c# 模式。事实证明,问题首先是贾斯汀昨天纠正的,但还有一个问题,如果第一个条件为假,则第二个条件永远不会评估为真。这是它所引用的表的问题,它产生的字段值有时为 Null,有时为 0(其中!= null)。非常感谢贾斯汀为我指明了正确的方向并为我清理了我的代码。 【参考方案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;

更传统。

【讨论】:

首先,非常感谢您抽出宝贵时间不仅回答了我的问题,而且还为我编辑了我的问题。我花了几分钟根据您的建议使代码更清晰。然后我把它换成了一个 elsif ......我昨天错误地试图这样做,但拼写为 elsif。不幸的是,它并没有使问题消失。 tIsbindVar1的值为Number,tIsBindVar2的值为VarChar2(2)……不同的数据类型会影响进程吗? @dee - tIsBindVar1tIsBindVar2 的值是多少?例如,tIsBindVar1 是 NULL 吗?或者它是一个非 NULL 值?您是否尝试过调试代码以验证它是否按照您预期的方式运行? 对不起,我看错了 --- 我给你的是数据类型而不是值。 tIsBindVar1 的初始值为 null 尽管我已将其更改为 0 以进行测试,但没有运气。 tIsBindvar2 的值最初是“N”,但后来我将其切换为 := Function_Name (inParam1);根据您的建议。 @dee - 您希望代码使用三个路径中的哪一个?它实际使用哪个路径(基于调试)? 当我将它设置为测试第一个(tIsBindVar1 IS NOT NULL)或最后一个条件时,该过程有效。 (tIsBindVar1 IS NULL & tIsBindVar2 != 'Y') 当我尝试设置一个应该触发中间条件的场景时 (tIsBindVar1 IS NULL & tIsBindVar2 = 'Y'),我收到错误消息。我现在不在我的项目附近进行测试,但我认为您所说的问题必须与我设定的条件有关。具体来说,如果第一个条件为空,那么第二个条件永远不会是“Y”。这似乎很可能。我明天测试一下。 Tbh 我在调试时遇到了麻烦,需要查看它的工具/信息

以上是关于嵌套 if 语句返回语句句柄未执行错误的主要内容,如果未能解决你的问题,请参考以下文章

陷入错误循环:无法访问语句且未提供返回语句

js中if嵌套问题 请叫高手

Shell if else语句(详解版)

Excel错误跟踪IF嵌套语句

嵌套 IF 语句的 PL/SQL 错误

oracle 用if sqlcode != 0 来判断sql语句是不是成功 sqlserver 存储过程 怎样判断一条sql语句执行成功了没有