2014-10-31 65 views
0

我有以下問題。我試圖檢查一個數字(bsn),如果它在數據庫中或沒有。如果它不在數據庫中,它應該給我一個錯誤,但是現在即使數據庫中存在該數字,我也總是會發生錯誤。它在數據庫中只有一個數字就可以正常工作,但是更多...這就是問題所在。哦,我正在與APEX合作,所以我把它作爲一個過程。PL/SQL光標for循環和記錄不工作

create or replace PROCEDURE CONTROLE_BSN IS 

CURSOR c_klanten 
    IS 
    SELECT bsn 
    FROM klant; 

    v_bsn VARCHAR2(10) := V('P7_BSN'); 

    e_geen_bsn EXCEPTION; 

BEGIN 

    FOR r_record IN c_klanten 
    LOOP 
    IF r_record.bsn != v_bsn THEN 
     RAISE e_geen_bsn; 
    END IF; 
    END LOOP; 

EXCEPTION 
    WHEN e_geen_bsn THEN 
    raise_application_error(-20001, 'This bsn-number does not exists.'); 

END CONTROLE_BSN; 

回答

1

您的邏輯流動了。只要你在你的表中的兩個不同的bsn,你的測試將在其中的至少一個是真實的:

FOR r_record IN c_klanten 
    LOOP 
    IF r_record.bsn != v_bsn THEN --< when N different records, 
            -- this is true for at least N-1 of them 
     RAISE e_geen_bsn; 
    END IF; 
    END LOOP; 

也許你應該去的東西比這更簡單的一點點。爲什麼不寫你的光標這樣,而不是:

CURSOR c_klanten 
    IS 
    SELECT count(*) n 
    FROM klant 
    WHERE nbc = v_bsn; 

這樣的話,你很容易就會匹配bsn的數量。 0,1或更多。然後執行相應的操作。

+0

現在我得到以下問題IF r_record.bsn!= v_bsn THEN不被接受,因爲他找不到r.record.bsn? – viddrawings 2014-10-31 11:20:41

0

也許下面將幫助:

create or replace PROCEDURE CONTROLE_BSN IS 
    CURSOR c_klanten(p_bsn) IS 
    SELECT count(*) as bsn_count 
     FROM klant 
     where bsn = p_bsn; 

    v_bsn VARCHAR2(10) := V('P7_BSN'); 

    e_geen_bsn EXCEPTION; 
BEGIN 
    FOR r_record IN c_klanten(v_bsn) 
    LOOP 
    IF r_record.bsn_count = 0 THEN 
     RAISE e_geen_bsn; 
    END IF; 
    END LOOP;  
EXCEPTION 
    WHEN e_geen_bsn THEN 
    raise_application_error(-20001, 'This bsn-number does not exists.'); 
END CONTROLE_BSN; 

好運。

+0

謝謝我通過替換where bsn = v_bsn並僅使用select bsn而不是count(*)來解決問題。不知何故,這似乎很好! – viddrawings 2014-10-31 12:31:34