-1
Declare
  type v_year_arr is varray(100) of emps%rowtype;
  v_deptid emps.department_id%type :=90;
  v_rem1 number(5,2);
  v_rem2 number(5,2);  
  v_rem3 number(5,2);
  v_year v_year_arr;
Begin
   select * bulk collect into v_year from emps where department_id = v_deptid;
   v_rem1 := MOD(v_year.yof,4);
   v_rem2 := MOD(v_year.yof,100);
   v_rem3 := MOD(v_year.yof,400);
   for i..v_year loop
      If (v_rem1=0 and v_rem2=0 and v_rem3=0)
      then
        DBMS_OUTPUT.PUT_LINE('Leap year :'||v_year.yof);
      else
        DBMS_OUTPUT.PUT_LINE('Not a Leap year :'||v_year.yof)
      End if;
   end loop;
end;
4

1 に答える 1

2

次のように、カーソル FOR ループを使用してこれを記述したほうがよいと思います。

Declare
  v_deptid emps.department_id%type :=90;
  v_rem1 number(5,2);
  v_rem2 number(5,2);  
  v_rem3 number(5,2);
Begin
  FOR aRow IN (select * from emps where department_id = v_deptid)
  LOOP
    v_rem1 := MOD(aRow.yof,4);
    v_rem2 := MOD(aRow.yof,100);
    v_rem3 := MOD(aRow.yof,400);

    If (v_rem1=0 and v_rem2<>0) or (v_rem2=0 and v_rem3=0) then
      DBMS_OUTPUT.PUT_LINE('Leap year :'||aRow.yof);
    else
      DBMS_OUTPUT.PUT_LINE('Not a Leap year :'||aRow.yof)
    End if;
  end loop;
end;

SELECT...BULK COLLECT INTO...これにより、ステートメントによって 100 を超える行が返されるという潜在的な問題が解消されます。また、うるう年の決定を修正する自由を取りました。

共有してお楽しみください。

于 2013-08-08T13:10:20.173 に答える