DBAsupport.com Forums - Powered by vBulletin
Results 1 to 7 of 7

Thread: can we write this cursor in more efficent way

  1. #1
    Join Date
    May 2000
    Location
    Delhi
    Posts
    108

    can we write this cursor in more efficent way

    have a cursor that looks like this



    CURSOR resavations(i_sol_id IN NUMBER, i_warehouses_id IN NUMBER, i_dnl_ids IN NUMBER_ARRAY) IS

    SELECT sold.SALES_ORDER_LINES_ID,

    wat.warehouse_assortment_trans_id,

    sold.style_details_id,

    wwt.actual_quantity AS quantity,

    dnl.dispatch_note_lines_id,

    dnld.dispatch_note_line_details_id,

    wwt.warehouses_id

    FROM warehouse_assortment_trans wat,

    warehouse_trans wt,

    warehouse_trans_types wtt,

    warehouse_warehouse_trans wwt,

    sales_order_line_details sold,

    logistics.dispatch_note_lines dnl,

    logistics.dispatch_note_line_details dnld

    WHERE wat.sales_order_line_details_id = sold.sales_order_line_details_id

    AND wat.warehouse_trans_id = wt.warehouse_trans_id

    AND wt.warehouse_trans_id = wwt.warehouse_trans_id

    AND wt.warehouse_trans_types_id = wtt.warehouse_trans_types_id

    AND wtt.transaction_type_name = 'Ready for Shipment'

    AND sold.sales_order_line_details_id = dnld.sales_order_line_details_id

    AND dnld.dispatch_note_lines_id = dnl.dispatch_note_lines_id

    AND wwt.actual_quantity != 0

    AND wwt.warehouses_id = i_warehouses_id

    AND wat.sales_order_lines_id = i_sol_id

    AND dnl.dispatch_note_lines_id IN (SELECT * FROM TABLE ( cast ( i_dnl_ids as NUMBER_ARRAY) ));



    Where NUMBER_ARRAY is defined like the following

    CREATE OR REPLACE

    TYPE NUMBER_ARRAY AS TABLE OF NUMBER;



    After I have looked at my pl/sql function I have found out that (SELECT * FROM TABLE ( cast ( i_dnl_ids as NUMBER_ARRAY) )) is what seems to be taking the time.

    Because I if removed this and only put in one value like (i_dnl_ids IN NUMBER) instead of (i_dnl_ids IN NUMBER_ARRAY) it seems to be running better.

    But this will of course not work cause of multiple values that I have to pass to the cursor.



    Now my question is

    Is there a better way to do this?

    Or is this the only way?

    Sonu

  2. #2
    Join Date
    May 2000
    Location
    Delhi
    Posts
    108
    hi
    some more info for you
    *****
    You can get the details about this cursor in a package dispatch_note_pck.CONVERT_SOL_TO_DN_CLIENT_ARRAY
    **************
    CREATE OR REPLACE PACKAGE DISPATCH_NOTE_PCK AS
    TYPE ref_cursor IS REF CURSOR;
    FUNCTION CONVERT_SOL_TO_DN_CLIENT_ARRAY(p_users_id IN NUMBER, p_sol_id IN NUMBER_ARRAY, p_warehouses_id IN NUMBER_ARRAY, p_transport_decription_id IN NUMBER_ARRAY) RETURN ref_cursor;
    -- Description
    -- Used to convert sales order lines to dispatch notes and transfer them to BestPack version 2 for printing
    -- Parematers
    -- p_users_id : is the is for the user
    -- p_sol_id : is a array of sales order lines that have to be converted to dispatch notes
    -- p_warehouses_id : is a array of warehouses the sold have to be reserved on
    -- p_transport_desription : is the transport description the dispatch notes have to have.
    -- Return
    -- ref_cusor with the id for the dispatch_note_line that have been made
    END DISPATCH_NOTE_PCK;
    ***********
    can we write this cursor in some other way.
    sonu

  3. #3
    Join Date
    Nov 2001
    Location
    UK
    Posts
    152
    If the number of values in TABLE ( cast ( i_dnl_i )) is quite small, you could just format it into a string e.g,

    dnl.dispatch_note_lines_id IN (1,2,3,5,...);

    Alternatively, you could create a global temporary table and put the values of i_dnl_i into that. You could then do your "in" against the temporary table. You could even put an index on the temporary table, although the cost based optimizer doesn't always work well when you're mixing temporary and permanant tables in an query.

  4. #4
    Join Date
    Aug 2002
    Location
    Colorado Springs
    Posts
    5,253
    Quote Originally Posted by sonuji_in
    After I have looked at my pl/sql function I have found out that (SELECT * FROM TABLE ( cast ( i_dnl_ids as NUMBER_ARRAY) )) is what seems to be taking the time.

    Because I if removed this and only put in one value like (i_dnl_ids IN NUMBER) instead of (i_dnl_ids IN NUMBER_ARRAY) it seems to be running better.
    I don't think that this is a correct deduction. The difference probably lies in either a different execution plan for the two queries (with NUMBER and with NUMBER_ARRAY) or just because in the ARRAY version you are passing in a lot of values.

    So how many values are you generally passing in, and what is the explain plan for the query?
    David Aldridge,
    "The Oracle Sponge"

    Senior Manager, Business Intelligence Development
    XM Satellite Radio
    Washington, DC

    Oracle ACE

  5. #5
    Join Date
    May 2000
    Location
    Delhi
    Posts
    108
    hi

    my developers can pass 300-350 values.

    abhi

  6. #6
    Join Date
    May 2000
    Location
    Delhi
    Posts
    108
    hi we are trying this
    CURSOR resavations(i_sol_id IN NUMBER, i_warehouses_id IN NUMBER, i_dnl_ids IN NUMBER_ARRAY) IS

    SELECT sold.SALES_ORDER_LINES_ID,

    wat.warehouse_assortment_trans_id,

    sold.style_details_id,

    wwt.actual_quantity AS quantity,

    dnl.dispatch_note_lines_id,

    dnld.dispatch_note_line_details_id,

    wwt.warehouses_id

    FROM warehouse_assortment_trans wat,

    warehouse_trans wt,

    warehouse_trans_types wtt,

    warehouse_warehouse_trans wwt,

    sales_order_line_details sold,

    logistics.dispatch_note_lines dnl,

    logistics.dispatch_note_line_details dnld

    WHERE wat.sales_order_line_details_id = sold.sales_order_line_details_id

    AND wat.warehouse_trans_id = wt.warehouse_trans_id

    AND wt.warehouse_trans_id = wwt.warehouse_trans_id

    AND wt.warehouse_trans_types_id = wtt.warehouse_trans_types_id

    AND wtt.transaction_type_name = 'Ready for Shipment'

    AND sold.sales_order_line_details_id = dnld.sales_order_line_details_id

    AND dnld.dispatch_note_lines_id = dnl.dispatch_note_lines_id

    AND wwt.actual_quantity != 0

    AND wwt.warehouses_id = i_warehouses_id

    AND wat.sales_order_lines_id = i_sol_id

    AND Exists (select * from temporary table where ""coloumnname say it is"" idnld =dnl.dispatch_note_lines_id).


    can any body suggest me the better way of writing this

    sonu

  7. #7
    Join Date
    May 2000
    Location
    Delhi
    Posts
    108
    any more ideas my friends

    Abhi

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  


Click Here to Expand Forum to Full Width