微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

sql – ORACLE:找不到数据 – 但数据存在

调试包过程并在实际存在数据时找到无数据.

只测试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类型而不是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数据类型上添加任何功能(消耗更多空间/内存不是一项功能).

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐