ORACLE:未找到数据——但数据存在

发布于 2024-12-19 13:58:13 字数 1329 浏览 1 评论 0原文

调试包过程,当实际上有数据时却找不到数据。

仅测试 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 的值。

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

谢谢


解决 SQL Developer 中的奇怪行为使我忽略了潜在的空白:

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

Debugging a package procedure and am getting a no data found when there is in fact data.

Testing just the SELECT

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

This happily returns my value : '23706*706'

As soon as i try to have this selected INTO i get a NO_DATA _FOUND error
(commented out the error handling i put in)

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

I can catch the error just fine except for the fact that based on the 1st query i know 100% there is a value for FUCHSB in the database.

Any ideas.. I'm really starting to despise Oracle. Yes this query is being run over a datalink as seen in the 1st query the data is there.

Thanks


SOLVED strange behavior in SQL developer caused me to overlook potential whitespace:

It looks as though SQL Developer when running the standalone select applies its own trimming comparator when doing the 'WHERE sms_username = p_BAS_user_name;' portion.. turns out when sitting in the package it does not.. bunch of white space was causing the issue.. still strange that it returns on the normal select. Thanks though!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

一场春暖 2024-12-26 13:58:13

我很确定我找到了此行为的原因:我猜测该列实际上是 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 数据类型上添加任何功能(消耗更多空间/内存不是一个功能)。

I'm pretty sure I found the cause of this behaviour: I'm guessing that the column is actually of type CHAR and not VARCHAR2.

Consider the following:

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

Conclusion:

  • When working with the CHAR datatype, declare your PL/SQL variables as CHAR.
  • When possible, prefer the VARCHAR2 datatype for table column definition. The CHAR datatype is just a bloated VARCHAR2 datatype and doesn't add any feature over the VARCHAR2 datatype (consuming more space/memory is not a feature).
∞琼窗梦回ˉ 2024-12-26 13:58:13

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

select abc into var from table

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

I noticed another issue for the same error.
ERROR at line xx:
ORA-01403: no data found
ORA-06512: at line xx

select abc into var from table

If the query return no data, above error will throw.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文