2014-10-31 46 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