Oracle 甲骨文新手,不确定我是否“遗漏”了什么
以下通过PL/SQL的查询返回预期结果: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
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;
/