【问题标题】:ORACLE: NO DATA FOUND -- but data existsORACLE:未找到数据——但数据存在
【发布时间】:2012-01-14 03:58:31
【问题描述】:

正在调试一个包过程,当有实际数据时,我发现没有找到数据。

只测试 SELECT

SELECT trim(trailing '/' from GL_SECURITY) as DUMMY 
FROM b2k_user@b2k
WHERE sms_username = 'FUCHSB';

这很高兴返回我的值:'23706*706'

当我尝试选择这个 INTO 时,我得到一个 NO_DATA _FOUND 错误 (注释掉我输入的错误处理)

set serveroutput on

DECLARE  
    p_BAS_user_name varchar2(20);  
    v_gl_inclusion varchar2(1000);
    v_gl_exclusions varchar2(1000);
BEGIN  
    --inputs
    p_BAS_user_name := 'FUCHSB';
    dbms_output.put_line(p_BAS_user_name);    
----- GOOD ----- 

    --BEGIN
      SELECT trim(trailing '/' from GL_SECURITY) as DUMMY 
      INTO v_gl_inclusion 
      FROM b2k_user@b2k
      WHERE sms_username = p_BAS_user_name;   
    --EXCEPTION
    --  WHEN NO_DATA_FOUND THEN
    --    v_gl_inclusion := 'SUPER EFFING STUPID';
    --END;    
    dbms_output.put_line(v_gl_inclusion);

END;


Error report:
ORA-01403: no data found
ORA-06512: at line 12
01403. 00000 -  "no data found"
*Cause:    
*Action:
FUCHSB

我可以很好地捕捉到错误,除了基于第一个查询我知道 100% 数据库中有 FUCHSB 的值。

任何想法.. 我真的开始鄙视甲骨文。是的,此查询正在数据链路上运行,如第一个查询所示,数据在那里。

谢谢


解决了 SQL 开发人员的奇怪行为导致我忽略了潜在的空白:

在执行“WHERE sms_username = p_BAS_user_name;”时,运行独立选择时似乎 SQL Developer 应用了自己的修剪比较器部分..事实证明,当它坐在包中时,它没有..一堆空白导致了这个问题..它在正常选择时返回仍然很奇怪。不过还是谢谢!

【问题讨论】:

  • “一堆空白”是 CHAR 数据类型的正常行为 =)

标签: sql oracle plsql oracle10g


【解决方案1】:

我很确定我找到了这种行为的原因:我猜该列实际上是 CHAR 类型而不是 VARCHAR2。

考虑以下几点:

SQL> CREATE TABLE t (a CHAR(10));

Table created.

SQL> INSERT INTO t VALUES ('FUCHSB');

1 row created.

SQL> SELECT * FROM t WHERE a = 'FUCHSB';

A
----------
FUCHSB

SQL> DECLARE
  2    l VARCHAR2(20) := 'FUCHSB';
  3  BEGIN
  4    SELECT a INTO l FROM t WHERE a = l;
  5  END;
  6  /
DECLARE
*
ERROR at line 1:
ORA-01403: no data found
ORA-06512: at line 4

结论:

  • 使用 CHAR 数据类型时,请将 PL/SQL 变量声明为 CHAR。
  • 如果可能,首选 VARCHAR2 数据类型来定义表列。 CHAR 数据类型只是一个臃肿的 VARCHAR2 数据类型,并没有在 VARCHAR2 数据类型上添加任何特性(消耗更多空间/内存不是特性)。

【讨论】:

  • 好地方(和很好的例子)。我要添加到您的结论中的唯一一件事是尽可能避免在 PL/SQL 中显式声明数据类型,将其声明为: l t.a%TYPE
【解决方案2】:

我注意到同一错误的另一个问题。 第 xx 行的错误: ORA-01403: 未找到数据 ORA-06512: 在第 xx 行

select abc into var from table

如果查询没有返回数据,则会抛出上述错误。

【讨论】:

  • 谢谢,这发生在我的一个触发器中。我的 select into 语句为空。
猜你喜欢
  • 2016-04-03
  • 1970-01-01
  • 2013-12-06
  • 2016-04-26
  • 1970-01-01
  • 1970-01-01
  • 2019-12-30
  • 2020-08-08
相关资源
最近更新 更多