Database 循环和记录的PL/SQL游标不工作

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

我有以下问题。我正在尝试检查一个数字(bsn),它是否在数据库中。如果它不在数据库中,它应该给我一个错误,但是现在我总是得到一个错误,即使这个数字存在于数据库中。它在数据库中只有一个数字时运行良好,但在更多的情况下。。。这就是问题所在。哦,我在和APEX合作,所以我用这个作为一个过程

   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;