Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 甲骨文新手,不确定我是否“遗漏”了什么_Oracle_Loops_Plsql_While Loop - Fatal编程技术网

Oracle 甲骨文新手,不确定我是否“遗漏”了什么

Oracle 甲骨文新手,不确定我是否“遗漏”了什么,oracle,loops,plsql,while-loop,Oracle,Loops,Plsql,While Loop,以下通过PL/SQL的查询返回预期结果: select member_id, birth_date from ( select * from member order by member_id asc ) where birth_date > 0 and update_end_date = 29991231 and rownum <= 20; 它返回20行数据,按我希望的顺序排列 但是,当我将该查询的变体合并到SQL块内的while循环中时,它会在循环的第二次迭代中出错: set

以下通过PL/SQL的查询返回预期结果:

select member_id, birth_date from ( select * from member order by member_id asc ) where birth_date > 0 and update_end_date = 29991231 and rownum <= 20;
它返回20行数据,按我希望的顺序排列

但是,当我将该查询的变体合并到SQL块内的while循环中时,它会在循环的第二次迭代中出错:

set serveroutput on;

declare
    dob         number (8);
    currentDate number (8);
    mID         number (8);
    members     integer;
    i           integer;

begin
  select to_char(sysdate, 'YYYYMMDD') into currentDate from dual;
  dbms_output.put_line('Current Date: ' || currentDate);

  select count(*) into members from member where birth_date > 0 and update_end_date = 29991231;
  dbms_output.put_line('Member Records: ' || members);

  i := 1;
  while i <= 10
  loop 

    select member_id, birth_date into mID, dob from ( select * from member order by member_id asc ) where birth_date > 0 and update_end_date = 29991231 and rownum = i;

    dbms_output.put_line('Row number: ' || i || ' > Member ID: ' || mID || ' | Member DOB: ' || dob);

    i := i + 1;
  end loop;
end;
/
其思想是从有序结果的第一行开始,然后遍历每一行,输出该行的结果

最终,一旦我完成了这项工作,我打算将此数据与预期值进行比较,然后执行更多的条件逻辑

所以,除非我遗漏了一个基本的甲骨文,否则我看不到任何好的理由来解释为什么这个逻辑会失败

我确实认识到,我更多地使用通用脚本语言方法来执行我的逻辑,而不是使用嵌套的Oracle语句,但我不认为这有什么区别

再说一次,可能是无知在起作用


提前感谢。

结果集中很可能没有足够的记录来完成循环。例如,如果您只有两条记录,那么请求rownum=5的记录将导致无数据异常。您可以在异常块中捕捉到这一点:

BEGIN
i := 1;
  while i <= 10
  loop 

    select member_id, birth_date into mID, dob from ( select * from member order by member_id asc ) where birth_date > 0 and update_end_date = 29991231 and rownum = i;

    dbms_output.put_line('Row number: ' || i || ' > Member ID: ' || mID || ' | Member DOB: ' || dob);

    i := i + 1;
  end loop;
EXCEPTION WHEN NO_DATA_FOUND THEN NULL;
END;

更改“NULL”以处理异常,但这应该只是退出循环

问题在于rownum的工作方式。您只能在以下情况下使用rownum:从出生日期>0且更新日期=29991231的成员中选择count*into members;dbms|u output.put_行“成员记录:”||成员;返回的记录超过400000条,因此我高度怀疑返回的记录不足是一个问题,因为我将迭代次数限制为10个循环行重新测试,所以在这种情况下,我需要为每一行确定一种使用自定义值进行迭代的方法。。。也许将select的输出转储到一个temp_表中,在那里我可以定义一个rowID,例如?@gabrialmaclod-您可以选择到一个集合中并对其进行迭代,或者使用一个临时表,但我相信,这在Oracle中几乎总是过于苛刻,尽管在SQL Server中很常见。我已经添加了一个使用游标循环的版本,使用您的原始查询,我认为这将满足您的需要。
select * 
  from t 
 where ROWNUM > 1;
declare
    currentDate number (8);
begin
  select to_char(sysdate, 'YYYYMMDD') into currentDate from dual;
  dbms_output.put_line('Current Date: ' || currentDate);

  for r in (
    select member_id as mID, birth_date as dob, rownum as rn
    from (
      select * from member order by member_id asc
    )
    where birth_date > 0
    and update_end_date = 29991231
    and rownum <= 20
  )
  loop
    dbms_output.put_line('Row number: ' || r.rn
      || ' > Member ID: ' || r.mID
      || ' | Member DOB: ' || r.dob);
  end loop;
end;
/