How to fetch n rows at a time?

I know that I can use the rownum function to return n rows at a time, but the rownum function will be applied after all rows are returned by the query, which is bad for performance since my table has lot of rows. What I need is really to fetch n rows at a time from the DB.
Regards

I am not sure what you mean by "the rownum function will be applied after all rows are returned by the query", but that appears to be an incorrect statement. If you have a ROWNUM limit in a query, Oracle knows that it only has to fetch the first M rows.
If you are looking for an ability to page through query results, there is an AskTom thread on pagination in SQL.
This would only be appropriate, though, if you expect that users will only ever want the first few pages of results (i.e. users of Google aren't going to look through every page of results for generic search terms, they are going to look at page 1, maybe page 2 and page 3, and then stop). If the application is going to process all the rows that the query returns, you'd need some other construct and we would need some additional requirements. Your client application can probably fetch N rows at a time. If the client is PL/SQL, a BULK COLLECT with a LIMIT clause may also be appropriate.
Justin

Similar Messages

  • How to fetch indivdual rows from a dynamic query.

    Hi,
    I wish to fetch the individual rows returned from a dynamic query.
    if my dynamic query is:
    dyn_stmt := select col1, col2, col3
    from tab1;
    The query returns multiple rows.
    Then how to fetch individual rows of this query ?
    Please explain.

    declare
      cur_test sys_refcursor;
      c1 varchar2(30);
      c2 number;
      c3 date;
    begin
      dyn_stmt := select col1, col2, col3 from tab1;
      OPEN cur_test FOR dyn_stmt;
      LOOP
        FETCH cur_test INTO c1, c2, c3;
        IF cur_test%NOTFOUND THEN
          EXIT;
        END IF;
        -- Process this row
      END LOOP;
      CLOSE cur_test;
    END;

  • How to get multiple rows at one time in a table?

    hi
    I have a JTable bound with ViewObject and i use multiple selection mode setting to get selection row.
    My question is when i select more then one row at one time i only can get those index from JTable but can't get those rows from ViewObject.is it possible to get rows from ViewObject? or how to use JTable row index to get row from ViewObject?

    repost

  • How to fetch a row with maximum rownum

    In my sql query, how can i fetch the row with max row count? the query has around 10 columns.
    Thank You
    KK

    Hi,
    It's not very clear what you want.
    It sounds like you want a Top=-N Query , perhaps like this:
    WITH     got_row_cnt     AS
         SELECT       job
         ,       COUNT (*)                         AS row_cnt
    --     ,       ...  -- other columns
         ,       RANK () OVER (ORDER BY  COUNT (*) DESC)     AS rnk
         FROM       scott.emp
         GROUP BY  job
    SELECT     *     -- or list all columns except rnk
    FROM     got_row_cnt
    WHERE     rnk     = 1
    Whenever you have a problem, please post a little sample data (CREATE TABLE and INSERT statements, relevant columns only) from all tables involved.
    Also post the results you want from that data, and an explanation of how you get those results from that data, with specific examples.
    Always say which version of Oracle you're using (for example, 11.2.0.2.0).
    See the forum FAQ {message:id=9360002}

  • How to display the rows number of times by giving the column values?

    Hi All,
    I want to display the rows number of times as the value exists in num column in the below query
    with t AS
       ( SELECT 'venkatesh' NAME, 'hyd' LOC, 2 NUM FROM DUAL
         UNION ALL
         SELECT 'prasad' NAME, 'hyd' LOC, 3 NUM FROM DUAL
         UNION ALL
         SELECT 'krishna' NAME,     'hyd' LOC, 1 NUM FROM DUAL )
      SELECT T.* FROM T
      CONNECT BY ROWNUM <= NUM
    Expected output:
             venkatesh            hyd      2
             venkatesh            hyd        2
             prasad                 hyd        3
             prasad                   hyd      3
             prasad                   hyd      3
             krishna           hyd       1Edited by: Nag Aswadhati on Nov 1, 2012 12:34 AM

    Nag Aswadhati wrote:
    Hi All,
    I want to display the rows number of times as the value exists in num column in the below query
    Expected output:
    venkatesh            hyd      2
    venkatesh            hyd        2
    prasad                 hyd        3
    prasad                   hyd      3
    prasad                   hyd      3
    krishna           hyd       1Using Connect By:-
    with t AS
       ( SELECT 'venkatesh' NAME, 'hyd' LOC, 2 NUM FROM DUAL
         UNION ALL
         SELECT 'prasad' NAME, 'hyd' LOC, 3 NUM FROM DUAL
         UNION ALL
         select 'krishna' name,     'hyd' loc, 1 num from dual )
      select t.name, t.loc
      from t
      connect by level <= num
             and name = prior name
             and (prior sys_guid() is not null);
    NAME      LOC
    krishna   hyd
    prasad    hyd
    prasad    hyd
    prasad    hyd
    venkatesh hyd
    venkatesh hyd
    6 rows selected

  • How to insert 10 rows at a time in the oracle

    how ti insert r update 10 query at a time in the oracle

    You can do a small test to find it out.
    SQL> set serveroutput on
    SQL> drop table t
      2  /
    Table dropped.
    SQL> drop table s
      2  /
    Table dropped.
    SQL> create table s(no integer, name varchar2(4000))
      2  /
    Table created.
    SQL> create table t(no integer, name varchar2(4000))
      2  /
    Table created.
    SQL> insert into s
      2  select level, rpad('*',4000,'*')
      3    from dual
      4  connect by level <= 10000
      5  /
    10000 rows created.
    SQL> commit
      2  /
    Commit complete.
    SQL> declare
      2     ltime integer;
      3  begin
      4     ltime := dbms_utility.get_time;
      5
      6     for i in (select * from s)
      7     loop
      8             insert into t(no, name) values(i.no,i.name);
      9     end loop;
    10
    11     ltime := dbms_utility.get_time - ltime;
    12
    13     dbms_output.put_line('Exec Time:'||ltime/100||' Seconds...');
    14     commit;
    15  end;
    16  /
    Exec Time:17.22 Seconds...
    PL/SQL procedure successfully completed.
    SQL> truncate table t
      2  /
    Table truncated.
    SQL> declare
      2     type my_type is table of s%rowtype;
      3     lType my_type;
      4     ltime integer;
      5  begin
      6     ltime := dbms_utility.get_time;
      7
      8     select * bulk collect into lType from s;
      9
    10     forall i in 1..lType.count
    11             insert into t values lType(i);
    12
    13     ltime := dbms_utility.get_time - ltime;
    14
    15     dbms_output.put_line('Exec Time:'||ltime/100||' Seconds...');
    16
    17     commit;
    18  end;
    19  /
    Exec Time:6.27 Seconds...
    PL/SQL procedure successfully completed.
    SQL> truncate table t
      2  /
    Table truncated.
    SQL> declare
      2     ltime integer;
      3  begin
      4     ltime := dbms_utility.get_time;
      5
      6     insert into t select * from s;
      7
      8     ltime := dbms_utility.get_time - ltime;
      9
    10     dbms_output.put_line('Exec Time:'||ltime/100||' Seconds...');
    11
    12     commit;
    13  end;
    14  /
    Exec Time:3.26 Seconds...
    PL/SQL procedure successfully completed.Thanks,
    Karthick.

  • How to fetch n records at a time from a FM and then fetch next n records

    I have a report program which is calling a function module . This function module returns all the records from a table. As the table has millions of records, it cant be returned at a time. How can we return N records from a function module and then return Next n records .The Function module and the report program are in different system .
    Thanks in Advance.

    Use open cursor and fetch cursor.
    Check the program as in SAP Help.
    DATA: BEGIN OF count_line,
            carrid TYPE spfli-carrid,
            count  TYPE i,
          END OF count_line,
          spfli_tab TYPE TABLE OF spfli.
    DATA: dbcur1 TYPE cursor,
          dbcur2 TYPE cursor.
    OPEN CURSOR dbcur1 FOR
      SELECT carrid count(*) AS count
             FROM spfli
             GROUP BY carrid
             ORDER BY carrid.
    OPEN CURSOR dbcur2 FOR
      SELECT *
             FROM spfli
             ORDER BY carrid.
    DO.
      FETCH NEXT CURSOR dbcur1 INTO count_line.
      IF sy-subrc <> 0.
        EXIT.
      ENDIF.
      FETCH NEXT CURSOR dbcur2
        INTO TABLE spfli_tab PACKAGE SIZE count_line-count.
    ENDDO.
    CLOSE CURSOR: dbcur1,
                  dbcur2.
    Regards
    Kannaiah

  • How to Fetch the Row value in SBO Formatted search

    Hi Experts,
    I have created a Sales order, in which i  have 4 UDF Fields(A,B,C,D) in the following:
    Example values:
    A  B  C  D 
    2   2   4  4
    3   2   6  10
    C=A*B
    D=1st value of D + 2nd col value of C
    i have written query for C, but how to write the Formatted search Query for generation of D values. plz reply as soon as possible.

    Magesh,
    I quite understand what you are trying to do.   If you look at the example below I added a third row to show how you want the D to be a running total of column C. RIGHT !!
    A B C D
    2 2 4 4
    3 2 6 10
    <b>4 2 8 18</b>
    Honestly, it is not going to be simple as you do not have a way in SBO to access a particular column from a row.  When you say $[$38.U_C] it refers to the context row OR the row which has the highlight OR the row which has the curson on it.
    It is not possible to say $[$38.U_C from row 2]  JUST  NOT POSSIBLE ...
    You have to write a tricky code by using a temp table referencing the value of column C.  Also you have to keep track if Rows gets deleted and a new row added. 
    I will test a sample code and will come back.
    Suda

  • How to Fetch Customer information at the time of Order Import- Urgent

    We have a requirement to Interface data from 2 different systems.
    Booking and Order Information data will come from ----Source 1
    Customer information will come from -----Source 2
    The only Primary key that will be common is the an attribute like 'Customer_ID' that will be sent from 'Source 1.'
    Now in Oracle- we need to Import all of the Booking and Order information from Source 1 and also based on the Customer_ID from Source 1 we need to pull Customer address, contact and name details and also the Payment terms that would already be created in TCA before the Order is imported from Source 1.
    How will Order Import know to fetch the details of Customer attributes that are required to go into an Oracle Order. (Such as Address, contact details, customer name) - All these need to be pulled usin Customer_ID.

    As long as customer is defined in oracle, all you need to pass to the order interface tables is the customer_number( or customer_id).
    The order import itself will pull some information such as customer name automatically.
    However, your custom code that puts data in the interface table should query up the customer site records / contact records and put the data in the interface table before launching the Order Import.
    Hope this helps,
    Sandeep Gandhi

  • How to fetch single row data into multiple columns

    Hi Have a cursor
    which will have SELECT Sun_hrs,Mon_hrs,Tue_hrs,Wed_hrs,Thu_hrs,Fri_hrs,Sat_hrs from OTMaster;
    now my cursor has one row of the above columns with this row data I want to insert into other tale as column wise
    ex:
    my row is like this: Sun_hrs,Mon_hrs,Tue_hrs,Wed_hrs,Thu_hrs,Fri_hrs,Sat_hrs
    01:00 01:00 01:00 01:00 01:00 01:00 01:00
    now I want to insert the above data into table with loop along with weekday
    weekday, OTHrs
    1 01:00
    2 01:00
    3 01:00
    4 01:00
    5 01:00
    6 01:00
    7 01:00
    which type of variable I need to fetch the records, rowtype or tabletype,
    plz help me

    thank you for information, and now I am using UNPIVOT below is my query
    SELECT * FROM OTCEILINGMASTER
    UNPIVOT(OTHOURS FOR WEEK_DAY IN (SUN_CEILING_HRS AS '1',MON_CEILING_HRS AS '2',TUE_CEILING_HRS AS '3',
    WED_CEILING_HRS AS '4',THU_CEILING_HRS AS '5',FRI_CEILING_HRS AS '6',SAT_CEILING_HRS AS '7'));
    when I am selecting all the columns (select * from OTCEILINGMASTER) then only the above query is executing I want only two columns from the table however my table has 10 columns.
    please looking into this

  • How to fetch each row data

    Hi,
    I have written a CQL query with rows 3 records. In that query is it possible to fetch first record and last record specific field values.
    for example,
    Column: c1, c2, c3
    record1: id1, 2.3, 3.5
    record2: id2, 2.3, 3.6
    record3: id21, 2.3, 3.7
    record3: id25, 2.3, 3.9
    I need to get moving average of three rows of c3 and get first record id and last record ids.
    output1: id1, id1, avg(c3)=3.5
    output2: id1, id2, avg(c3)=3.55
    output3: id1, id21, avg(c3)=3.6
    output4: id2, id25, avg(c3)=3.733
    Please help on above.
    Thanks,
    Sri

    I have one more question.
    The average output is given as input to pattern match processor.
    The double differentiation differentiation of first 2 average input data in CQL pattern match is written as:
    <view id="FetchRows">
         <![CDATA[ istream(select * from mdepthChannel)
                     ]]>
    </view>
    <query id="ExampleQuery">
         <![CDATA[ select *      
                     from FetchRows 
                     MATCH_RECOGNIZE (
                     Measures
                             v1.wellUid as wellUid,
                             v1.arrivalTime as arrivalTime,
                          v1.wellboreUid as wellboreUid,
                          v1.mdepthAverage as mdepthAverage,
                          v1.wopAverage as wopAverage,
                          v2.mdepthAverage as v2mdepthAverage,
                          v2.wopAverage as v2wopAverage,
                          v3.mdepthAverage as v3mdepthAverage,
                          v3.wopAverage as v3wopAverage,
                          getCalculateDerivative(v2.mdepthAverage,getCalculateDerivative(v1.mdepthAverage,v1.wopAverage,v2.mdepthAverage,v2.wopAverage),v3.mdepthAverage,getCalculateDerivative(v2.mdepthAverage,v2.wopAverage,v3.mdepthAverage,v3.wopAverage)) as derValue
                     ALL MATCHES
                     PATTERN (v1 v2 v3)
                     DEFINE
                     v3 as (getCalculateDerivative(v2.mdepthAverage,getCalculateDerivative(v1.mdepthAverage,v1.wopAverage,v2.mdepthAverage,v2.wopAverage),v3.mdepthAverage,getCalculateDerivative(v2.mdepthAverage,v2.wopAverage,v3.mdepthAverage,v3.wopAverage)) <= 0.0)               
                        ) as T
                     ]]>           
    </query>
    Where "getCalculateDerivative" is the java function returns slope of straight line.
    The output of this query returns correct data till 7th record after that it repeats 6nd record.
    That 8th record is the same as 6th record data.
    Why that 8th record is the 6nd record repeats.
    The desired output is same as input record if pattern matches.
    Please help on this.
    Thanks,
    Sri
    Edited by: 897694 on Mar 27, 2012 2:15 AM

  • With dynamic CreateViewObject How To "Navigate N rows at a time using DataTags" fails

    I have worked with the example on this link:
    http://otn.oracle.com/docs/products/jdev/howtos/jsp/traverse_n.ht
    ml
    It works fine in case I am using the View Object created in the
    Package as the example is using.
    However, this sample does not navigate; through record as
    expected and keep displaying same records, when I create dynamic
    view using CreateViewObject tag like this:
    <jbo:CreateViewObject appid="TravelPkgModule" name="test">
    select vc_comp_code,vc_voucher_no from hd_travel_voucher
    </jbo:CreateViewObject
    Help me in navigating with dynamic view objects.

    moreover,
    suppose total records in a set are = 100
    and range size = 10
    on first click on next set, records from 1 to 10 are displayed.
    on second click on next set, records from 11 to 20 are displayed.
    on third or N'th click on next set, records from 11 to 20 are
    displayed and not from 21 onwards are displayed.
    Code attached.
    <%@ page errorPage="errorpage.jsp"
    contentType="text/html;charset=WINDOWS-1252"
    import="java.util.*,java.text.*" %>
    <%@ page contentType="text/html;charset=WINDOWS-1252"%>
    <HTML>
    <BODY>
    <%@ taglib uri="/webapp/DataTags.tld" prefix="jbo" %>
    <jbo:ApplicationModule
    configname="TravelPkg.TravelPkgModule.TravelPkgModuleLocal"
    id="TravelPkgModule" username="ebiz" password="ebiz" />
    <jbo:DataSource id="Qvoucher" appid="TravelPkgModule"
    viewobject="HdTravelVoucherView" rangesize="2">
    </jbo:DataSource>
    <%
    %>
    Next Set
    Previous Set
    <table border="1">
    <%
    oracle.jbo.RowSet rs = Qvoucher.getRowSet(); // see if we have
    a navigation command
    if(request.getParameter("nav") != null)
         String sNavigation = request.getParameter("nav");
    if(sNavigation.equalsIgnoreCase("nextset"))
         %>kiran = <%     
         rs.scrollRange(rs.getRangeSize());
    else
         rs.scrollRange(-rs.getRangeSize());
    oracle.jbo.Row rows[] = rs.getAllRowsInRange();
    for(int i = 0; i < rows.length; i++)
         rs.setCurrentRow(rows);%>
         <tr><td>
         <jbo:ShowValue datasource="Qvoucher"
    dataitem="VcEmpCode"></jbo:ShowValue></td>
         <td><jbo:ShowValue datasource="Qvoucher"
    dataitem="VcVoucherNo"></jbo:ShowValue></td>
    <% }%>
    LENGHT = <%=rows.length%>
    </table></BODY></HTML>
    <jbo:ReleasePageResources releasemode="Reserved" />

  • How to fetch some certain records at a time

    Hi everyone,
    I dont know how to fetch some records at a time,
    for some reason,there is not enouht memory.so I cant
    fethch all the records at a time.
    example, every time I only want to fetch 10
    records. Does anyone know that?
    thanks
    Krussi

    I think you may be getting setFetchSize(int) and setMaxRows(int) confused. I may have added to the confusion with my breaking out of the loop comment.
    setFetchSize(int) gives the driver a hint as to how many rows it should store in memory at a time internally, ie. within the driver. It has no real effect on how you write your program at all. Its only purpose is to limit memory usage by the driver. To limit the rows returned, use setMaxRows.
    For example, assume a result set has 20 rows and you use:
    rs.setFetchSize(5);
    while (rs.next()) {
       System.out.println("Rows: " + (++count));
    }  You still get a count from 1 to 20. However, internally the driver is only holding in memory 5 records at a time, after the 5 returned it will discard those and get the next 5. So instead of holding 20 rows, its only holding 5 at a time. If you change rs.setFetchSize(5) to rs.setMaxRows(5) you will only get a count from 1 to 5, the rest are silently discared and rs.next() returns false.
    Check your documentation to see if your driver supports the method. I believe many drivers don't. If not, I believe there is no way around multiple queries. Even if there is no rowid, as long as you order your queries you should be able to start again where you left off.
    Disclaimer: Both drivers I commonly use do not implement setFetchSize(int). Someone let me know if I've fudged something here.
    Good Luck

  • Procedure to delete mutiple table records with 1000 rows at a time

    Hello Champs,
    I am having requirement to create procedure to achive the deletes from 5 big tables. 1 master table and 4 child tables. Each table has 28 millions records. Now I have to schedule a procedure to run it on daily basis to delete approximately 500k records from each tables. But the condition is: Seperate procedures for each tables and delete only 1000 rows at a time. The plan is below. Since I am new for writing complicate procedure, I don't have much idea how to code the procedures, can some one help me to design the procedure queries. Many Thanks
    1. Fetch 1000 rows from master table with where clause condition.
    2. Match them with each child tables and delete the records.
    3. Atlast delete those 1000 rows from master table.
    4. over all commit for all 5 X 1000 records.
    5. Repeat the steps 1 to 4 till no rows to fetch from master table.
    Below are detailed procedure plan:----
    ----- Main procedure to fetch 1000 rows at a time and providing them as input to 5 different procedures to delete records, repeating same steps till no rows to fetch i.e. (i=0)-----
    Create procedure fetch_record_from_master_table:
    loop
    i = Select column1 from mastertable where <somecondition> and rowcount <= 1000;
    call procedure 1 and i rows as input;
    call procedure 2 and i rows as input;
    call procedure 3 and i rows as input;
    call procedure 4 and i rows as input;
    call procedure 5 and i rows as input;
    commit;
    exit when i=0
    end loop;
    ----- Sepereate procedure's to delete records from each child tables------
    Create procedure 1 with input:
    delete from child_table1 where column1=input rows of master table;
    Create procedure 2 with input:
    delete from child_table2 where column1=input rows of master table;
    Create procedure 3 with input:
    delete from child_table3 where column1=input rows of master table;
    Create procedure 4 with input:
    delete from child_table4 where column1=input rows of master table;
    --- procedure to delete records from master table atlast----
    Create procedure 5 with input:
    delete from Master_table where column1=input rows of master table;

    Oops, but this will work, won't it?
    begin
      execute immediate 'truncate table child_table1';
      execute immediate '  truncate table child_table2';
      execute immediate '  truncate table child_table3';
      execute immediate '  truncate table child_table4';
      for r_fk in ( select table_name, constraint_name
                    from user_constraints
                    where table_name = 'MASTER_TABLE'
                    and   constraint_type = 'R'
      loop
        execute immediate 'ALTER TABLE ' || r_fk.table_name || ' MODIFY CONSTRAINT ' || r_fk.constraint_name || ' DISABLE';
      end loop;
      execute immediate '  truncate table master_table';
      for r_fk in ( select table_name, constraint_name
                    from user_constraints
                    where table_name = 'MASTER_TABLE'
                    and   constraint_type = 'R'
      loop
        execute immediate 'ALTER TABLE ' || r_fk.table_name || ' MODIFY CONSTRAINT ' || r_fk.constraint_name || ' ENABLE';
      end loop;
    end;
    / Or
      truncate table child_table1;
      truncate table child_table2;
      truncate table child_table3;
      truncate table child_table4;
    begin
      for r_fk in ( select table_name, constraint_name
                    from user_constraints
                    where table_name = 'MASTER_TABLE'
                    and   constraint_type = 'R'
      loop
        execute immediate 'ALTER TABLE ' || r_fk.table_name || ' MODIFY CONSTRAINT ' || r_fk.constraint_name || ' DISABLE';
      end loop;
    end;
    truncate table master_table;
    begin
      for r_fk in ( select table_name, constraint_name
                    from user_constraints
                    where table_name = 'MASTER_TABLE'
                    and   constraint_type = 'R'
      loop
        execute immediate 'ALTER TABLE ' || r_fk.table_name || ' MODIFY CONSTRAINT ' || r_fk.constraint_name || ' ENABLE';
      end loop;
    end;
    /

  • How to update multiple rows in one query using php

    i am new to this can any one help me how to update multiple rows at a time i am doing an school attendance page

    Often the situation is such that you have multiple courses across a range of dates.So students may take more than one course, and you need to track attendance for each course date. The following graphic demonstrates this:
    In such a situation, you need four database tables as follows:
    students (student_id, student_name, etc.)
    courses (course_id, course_name, etc.)
    students_courses (student_id, course_id)
    attendance (student_id, course_id, dater)
    A fifth table may also be needed to define the dates of courses, but you may also be able to build this array programmatically by using PHP's robust date functions, which can give you, for instance, all the Tuesdays and Thursdays between a start date and end date.
    The students_courses table simply keeps track of which students are taking which courses, so it has just two columns for the primary keys of both of the main tables. The attendance table is similar, but it also includes a date field. The following view of the attendance table demonstrates this:
    So if David's solution does cover your needs, consider yourself lucky, because this could quickly grow from a beginner-appropriate project to a moderately advanced one.

Maybe you are looking for