2012-02-07 47 views
0

我使用下面的查詢返回一個值:甲骨文返回遊標在表中的所有行儘管where子句

select er.elig_code 
from idm_elig_rule er 
where ER.ROLE_CODE = role_code and ER.SERVICE_CODE = service_code; 

當我替換值變量並運行它作爲一個單一的SQL語句將返回只是像我想要的那樣一個單一的價值。但是,當我將該語句放在遊標中並循環遍歷結果時,它將返回表中的所有行。我也嘗試了「select into」語句,但仍然返回表中的所有85行。我在idm_elig_rule表中有一個唯一的索引,它是role_code,service_code和另一列的組合。

編輯:這就是我如何測試它 - 使用匿名塊:

declare 
    role_code_in IDM_ELIG_RULE.ROLE_CODE%type := 'CEMP'; 
    service_code_in IDM_ELIG_RULE.SERVICE_CODE%type := 'PORTL'; 
    cursor get_elig_code is 
     select ER.ELIG_CODE 
     from idm_elig_rule er 
     where ER.ROLE_CODE = role_code_in and ER.SERVICE_CODE = service_code_in; 
begin 
    for r in get_elig_code 
    loop 
     DBMS_OUTPUT.PUT_LINE(r.elig_code); 
    end loop; 
end; 

編輯:我改變了變量的名稱在where子句中,並且解決了問題。

+1

您確定遊標中使用的參數(role_code和service_code)在執行時是否具有正確的值? (例如,您可以使用dbms_output打印出數值還是以其他方式驗證它們?) – 2012-02-07 14:19:28

+1

顯示如何循環顯示結果 – tbone 2012-02-07 14:21:05

+0

繁榮!剛剛添加了我的答案,其他兩個同時進來。我認爲他們都說同樣的事實應該告訴你你的答案! – Ollie 2012-02-07 14:25:37

回答

9

由於綁定變量名稱與列名稱相同,因此您的變量名稱具有名稱解析問題。更改變量名稱以避免PL/SQL編譯器爲您做出決定。

Oracle PL/SQL Variable Name Resolution

+0

這一個可能真的令人沮喪找到! – 2013-09-20 01:09:23

3

由於您的變量名是相同的列名,這是可能的解析器看到他們作爲列名,而不是變量,所以你得到所有行,其中列等於它們自己,這隻會排除具有NULL值的行。

爲了避免混淆,我建議你的變量總是使用不同的名稱作爲變量。常用的技術是在變量名稱上使用一些前綴,例如局部變量爲l_,參數爲p_,或者全局變量爲g_

在這種情況下,它可能是更好的參數光標:

CURSOR code_cur (p_role_code INTEGER, p_service_code INTEGER) IS 
select er.elig_code 
from idm_elig_rule er 
where ER.ROLE_CODE = p_role_code and ER.SERVICE_CODE = p_service_code; 

,那麼你會在打開遊標時傳遞值,如:

FOR code_rec IN code_cur (my_role_code_value, my_service_code_value) LOOP 
3

從你的問題的資料有限我會說你的參數沒有正確實例化,你的選擇是解決:

select er.elig_code 
    from idm_elig_rule er 
where ER.ROLE_CODE = role_code 
    and ER.SERVICE_CODE = service_code; 

其中數據庫看到role_codeservice_code作爲列而不是變量,因此它將始終返回表中的所有行。

將變量的名稱更改爲與列名不同的名稱,以查看是否屬於這種情況。