Database 循环和记录的PL/SQL游标不工作
我有以下问题。我正在尝试检查一个数字(bsn),它是否在数据库中。如果它不在数据库中,它应该给我一个错误,但是现在我总是得到一个错误,即使这个数字存在于数据库中。它在数据库中只有一个数字时运行良好,但在更多的情况下。。。这就是问题所在。哦,我在和APEX合作,所以我用这个作为一个过程Database 循环和记录的PL/SQL游标不工作,database,plsql,cursor,record,Database,Plsql,Cursor,Record,我有以下问题。我正在尝试检查一个数字(bsn),它是否在数据库中。如果它不在数据库中,它应该给我一个错误,但是现在我总是得到一个错误,即使这个数字存在于数据库中。它在数据库中只有一个数字时运行良好,但在更多的情况下。。。这就是问题所在。哦,我在和APEX合作,所以我用这个作为一个过程 create or replace PROCEDURE CONTROLE_BSN IS CURSOR c_klanten IS SELECT bsn FROM klant; v
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;
你的逻辑是流畅的。一旦您的表中有两个不同的
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;
这样,您将很容易获得匹配的bsn的编号。0、1或更多。然后执行适当的操作。也许以下操作会有所帮助:
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;
祝你好运。如果r\u record.bsn!=v_bsn则不被接受,因为他找不到r.record.bsn?谢谢,我通过替换where bsn=v_bsn并只使用select bsn而不是count(*)解决了这个问题。不知何故,这似乎工作得很好!
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;