2011-12-06 22 views
5

調試程序包過程並在實際存在數據時找不到數據。ORACLE:找不到數據 - 但有數據存在

測試只是SELECT

SELECT trim(trailing '/' from GL_SECURITY) as DUMMY 
FROM [email protected] 
WHERE sms_username = 'FUCHSB'; 

這愉快地返回自己的價值:「23706 * 706」

只要我努力以這種選入我得到一個無音_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 [email protected] 
     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%是有VAL用於數據庫中的FUCHSB。

任何想法..我真的開始鄙視甲骨文。是的,這個查詢是通過數據鏈接運行的,如在第一個查詢中看到的那樣,數據在那裏。

感謝


在SQL開發人員

解決的奇怪的行爲引起了我的忽視潛在的空白:

看起來好像SQL Developer的運行獨立選擇時做時應用自己修剪比較的「WHERE sms_username = p_BAS_user_name;'部分..原來當坐在包裏它不..一堆白色空間導致問題..仍然奇怪,它返回正常選擇。雖然謝謝!

+0

「一堆空白」是CHAR的正常行爲datatype =) –

回答

10

我很確定我找到了這種行爲的原因:我猜測該列實際上是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數據類型上添加任何功能(消耗更多空間/內存不是功能)。
+0

哇,好點! +1 –

+0

不錯的地方(和很好的例子)。我想添加到結論中的唯一方法是避免在可能的情況下顯式聲明PL/SQL中的數據類型,將其聲明爲:l t.a%TYPE –

0

我注意到同樣的錯誤的另一個問題。 行錯誤XX: ORA-01403:找不到數據 ORA-06512:在XX線

select abc into var from table 

如果查詢返回的數據,上述錯誤就會拋出。