Skip to Main Content

SQL & PL/SQL

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Foreach returning only the first row of a dataset

vinicius.zhuAug 9 2013 — edited Aug 12 2013

Good morning, guys.

I am having some trouble with a procedure in Oracle 9.2.0.1.0.

I have a query that returns many rows, but whenever I try to iterate through it using a foreach loop, I get only the first row and then the loop is finished.

For instance, here is the query:

select

      (

        CASE

          WHEN

            TO_DATE(

            to_char(add_months(trunc(DATE '2009-01-01','mm'),level - 1),'dd') || '/' ||

            to_char(add_months(trunc(DATE '2009-01-01','mm'),level - 1),'mm') || '/' ||

            to_char(add_months(trunc(DATE '2009-01-01','mm'),level - 1),'yyyy'),'DD/MM/YYYY') < DATE '2009-01-01'

          THEN DATE '2009-01-01'

          ELSE

            TO_DATE(

            to_char(add_months(trunc(DATE '2009-01-01','mm'),level - 1),'dd') || '/' ||

            to_char(add_months(trunc(DATE '2009-01-01','mm'),level - 1),'mm') || '/' ||

            to_char(add_months(trunc(DATE '2009-01-01','mm'),level - 1),'yyyy'), 'DD/MM/YYYY')

          END

      ) startdate,

      (

        CASE

          WHEN

          TO_DATE(

            to_char(add_months(trunc(DATE '2009-01-01','mm'),level) -1,'dd') || '/' ||

            to_char(add_months(trunc(DATE '2009-01-01','mm'),level - 1),'mm') || '/' ||

            to_char(add_months(trunc(DATE '2009-01-01','mm'),level - 1),'yyyy'),'DD/MM/YYYY') > DATE '2009-06-08'

          THEN DATE '2009-06-08'

          ELSE

          TO_DATE(

            to_char(add_months(trunc(DATE '2009-01-01','mm'),level) -1,'dd') || '/' ||

            to_char(add_months(trunc(DATE '2009-01-01','mm'),level - 1),'mm') || '/' ||

            to_char(add_months(trunc(DATE '2009-01-01','mm'),level - 1),'yyyy'), 'DD/MM/YYYY')

          END

      ) enddate

    

    FROM dual

    CONNECT by trunc(DATE '2009-06-08','dd') >= add_months(trunc(DATE '2009-01-01','dd'),level - 1)

Which shows me this output:

STARTDATEENDDATE
01/01/200931/01/2009
01/02/200928/02/2009
01/03/200931/03/2009
01/04/200930/04/2009
01/05/200931/05/2009
01/06/200908/06/2009

But whenever I run this code:

  for rec in

  (

    select

      (

        CASE

          WHEN

            TO_DATE(

            to_char(add_months(trunc(DATE '2009-01-01','mm'),level - 1),'dd') || '/' ||

            to_char(add_months(trunc(DATE '2009-01-01','mm'),level - 1),'mm') || '/' ||

            to_char(add_months(trunc(DATE '2009-01-01','mm'),level - 1),'yyyy'),'DD/MM/YYYY') < DATE '2009-01-01'

          THEN DATE '2009-01-01'

          ELSE

            TO_DATE(

            to_char(add_months(trunc(DATE '2009-01-01','mm'),level - 1),'dd') || '/' ||

            to_char(add_months(trunc(DATE '2009-01-01','mm'),level - 1),'mm') || '/' ||

            to_char(add_months(trunc(DATE '2009-01-01','mm'),level - 1),'yyyy'), 'DD/MM/YYYY')

          END

      ) startdate,

      (

        CASE

          WHEN

          TO_DATE(

            to_char(add_months(trunc(DATE '2009-01-01','mm'),level) -1,'dd') || '/' ||

            to_char(add_months(trunc(DATE '2009-01-01','mm'),level - 1),'mm') || '/' ||

            to_char(add_months(trunc(DATE '2009-01-01','mm'),level - 1),'yyyy'),'DD/MM/YYYY') > DATE '2009-06-08'

          THEN DATE '2009-06-08'

          ELSE

          TO_DATE(

            to_char(add_months(trunc(DATE '2009-01-01','mm'),level) -1,'dd') || '/' ||

            to_char(add_months(trunc(DATE '2009-01-01','mm'),level - 1),'mm') || '/' ||

            to_char(add_months(trunc(DATE '2009-01-01','mm'),level - 1),'yyyy'), 'DD/MM/YYYY')

          END

      ) enddate

    

    FROM dual

    CONNECT by trunc(DATE '2009-06-08','dd') >= add_months(trunc(DATE '2009-01-01','dd'),level - 1)   

  )

  loop

    DBMS_OUTPUT.put_line(TO_CHAR(rec.startdate, 'YYYYMMDD') || '-' || TO_CHAR(rec.enddate, 'YYYYMMDD'));

  end loop;

I get this output:

20090101-20090131

I tried debugging and I verified that the loop runs only once, then skips to end loop. Am I doing something wrong?

Thank you!

Best regards,

Vinicius

This post has been answered by Solomon Yakobson on Aug 9 2013
Jump to Answer
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Sep 9 2013
Added on Aug 9 2013
12 comments
998 views