【问题标题】:PL/SQL cursor for loop and record not working循环和记录的 PL/SQL 游标不起作用
【发布时间】:2014-10-31 10:23:13
【问题描述】:

我有以下问题。我正在尝试检查一个数字(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;

【问题讨论】:

    标签: database plsql cursor record


    【解决方案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 或更多。然后执行相应的操作。

    【讨论】:

    • 现在出现以下问题 IF r_record.bsn != v_bsn THEN is not accepted, because he can't find r.record.bsn?
    【解决方案2】:

    也许以下会有所帮助:

    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;
    

    祝你好运。

    【讨论】:

    • 谢谢我通过替换 where bsn = v_bsn 并仅使用 select bsn 而不是 count(*) 解决了这个问题。不知何故,这似乎工作正常!
    猜你喜欢
    • 2012-03-27
    • 2012-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    相关资源
    最近更新 更多