ORA-01403:未找到数据 ORA-06512:在第 8 行 01403。00000 -“未找到数据”

Posted

技术标签:

【中文标题】ORA-01403:未找到数据 ORA-06512:在第 8 行 01403。00000 -“未找到数据”【英文标题】:ORA-01403: no data found ORA-06512: at line 8 01403. 00000 - "no data found" 【发布时间】:2020-10-20 20:43:18 【问题描述】:

通常,这个基本的 If 语句应该返回数据,但我不明白,我在哪里犯了错误。 (CustNo 是 char(8)。)我认为问题的出现是因为 V_Id。在这个 Custno='C2388597' 的通常选择语句中,我可以得到数据。但是当它在 If 语句中时,它给出了 ORA-01403 错误代码。

提前感谢您的支持...

Declare 

  V_Id Deneme_Customer.Custno%type;
  V_Custbal Deneme_Customer.Custbal%Type;
  v_situation Deneme_Customer.Custbal_Situation%type;

Begin
  Select Custno, Custbal, Custbal_Situation Into V_Id, V_Custbal, V_Situation
    From Deneme_Customer Where V_Id ='&no';
  
  If (V_Custbal>=20 And V_Custbal<=100) Then 
    V_Situation:='Es tut mir sehr leid';
  Elsif (V_Custbal>=101 And V_Custbal<=1000) Then 
    V_Situation:='Guuuut';
  Elsif (V_Custbal>1000) Then 
    V_Situation:='Sehr Guuuut';
  Else Dbms_Output.Put_Line('Falsche Eingabe');

  End If;
  
  update Deneme_Customer set Custbal_Situation=v_situation where Custno=V_Id;

end;`

【问题讨论】:

BEGIN DBMS_OUTPUT.PUT_LINE( '"&amp;no;"' ); END; 输出什么?是否有任何尾随空格? 【参考方案1】:

我想v_id,它是一个局部变量,是Custno,它是你表格的一列,在第8行。

Custno'&amp;no' 的不匹配值可能仍需要异常处理,例如

Begin
  Select Custno, Custbal, Custbal_Situation Into V_Id, V_Custbal, V_Situation
    From Deneme_Customer 
   Where Custno = '&no';
  Exception When no_data_found then null;
 End;

【讨论】:

我已经添加了异常块,现在我没有任何错误消息,但我也没有任何结果。它应该返回 1 行数据。并且 Custno 和 V_id 有 CHAR(8) 类型。 您是否在 where 条件 @dwh_asil 中将 V_Id 替换为 Custno ?顺便说一句,对不起,我认为 custno 不是整数类型,所以请保留引号。 没问题。感谢您的所有支持。我刚刚更换了它们,不幸的是没有任何错误但也没有任何更新。同时我将 Custno 列修改为 Varchar2,但它也没有改变任何东西。【参考方案2】:

您无需使用 PL/SQL 来确定应该将 custbal_situation 设置为什么,您可以使用如下简单的更新语句轻松完成:

UPDATE deneme_customer
   SET custbal_situation =
           CASE
               WHEN custbal >= 20 AND custbal <= 100 THEN 'Es tut mir sehr leid'
               WHEN custbal >= 101 AND custbal <= 1000 THEN 'Guuuut'
               WHEN custbal > 1000 THEN 'Sehr Guuuut'
           END
 WHERE custbal >= 20;

如果您想将其修改为仅影响一位客户,只需将其添加到 where 子句中即可。

然后要查看任何未设置其值的客户,您可以使用类似这样的查询找到他们

SELECT custno, custbal, custbal_situation
  FROM deneme_customer
 WHERE custbal < 20;

【讨论】:

感谢您的支持。我知道我可以通过多种方式做到这一点,但在这里我正在尝试/学习使用 If 语句和带变量的语句。由于这个原因,我做的有点复杂。【参考方案3】:

看起来您可能没有任何匹配 Where V_Id ='&no' 的行,只是为了测试它从表 Where V_Id ='&no' 中选择计数并检查计数。

您的 V_Id 也是一个唯一列,如果不是,那么您需要在错误处理程序中处理与 where 子句匹配的多行的情况。

exception 
  when no_data_found then
    <handle apppropriately>
  when TOO_MANY_ROWS then
    <handle apppropriately>
 WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE
      ('Unknown error');
end

【讨论】:

V_id 是唯一列,并且任何行都匹配其中 v_id=no。当我检索到 SELECT COUNT 时也是如此。使用异常块,我没有出现任何错误,但表中仍然没有任何变化。

以上是关于ORA-01403:未找到数据 ORA-06512:在第 8 行 01403。00000 -“未找到数据”的主要内容,如果未能解决你的问题,请参考以下文章

ORA-01403: no data found

带有索引变量 oracle 的 TOP

PLSQL 触发器 ORA 01403 未找到数据

ORA-01403 - 未找到数据 - 即使游标 SELECT 语句运行良好

Oracle PL/SQL - ORA-01403 使用“SELECT INTO”时“未找到数据”

触发错误:ORA-01403 插入时找不到数据