sql >> Database >  >> RDS >> Oracle

Waarden herhalen, dynamische query maken en toevoegen aan resultatenset

Een pijplijntabelfunctie lijkt beter te passen bij wat u wilt, vooral als u alleen maar gegevens ophaalt. Zie http://www.oracle-base.com/ artikelen/misc/pipelined-table-functions.php

Wat u doet, is een type maken voor uw uitvoerrij. Dus in jouw geval zou je een object maken zoals

CREATE TYPE get_data_faster_row AS OBJECT(
    seq    NUMBER(15,2),
    value  VARCHAR2(10),
    item   VARCHAR2(10)
);

Maak vervolgens een tabeltype dat een tabel is die is samengesteld uit uw rijtype hierboven

CREATE TYPE get_data_faster_data IS TABLE OF get_data_faster_row;

Maak vervolgens uw tabelfunctie die de gegevens op een gepijplijnde manier retourneert. Pipelined in Oracle lijkt een beetje op rendement in .net (weet niet zeker of je daarmee bekend bent). Je vindt alle rijen die je wilt en "pijpt" ze een voor een in een lus. Wanneer uw functie is voltooid, bestaat de geretourneerde tabel uit alle rijen die u hebt doorgesluisd.

CREATE FUNCTION Get_Data_Faster(params) RETURN get_data_faster_data PIPELINED AS
BEGIN
    -- Iterate through your parameters 
        --Iterate through the results of the select using
        -- the current parameters. You'll probably need a 
        -- cursor for this
        PIPE ROW(get_data_faster_row(seq, value, item));
        LOOP;
    LOOP;
END;

EDIT:Na de opmerking van Alex hieronder, heb je zoiets als dit nodig. Ik heb dit niet kunnen testen, maar het zou je op weg moeten helpen:

CREATE FUNCTION Get_Data_Faster(in_seq_numbers IN seq_numbers_array, in_values IN text_array, in_items IN text_array, list IN VARCHAR2) RETURN get_data_faster_data PIPELINED AS
    TYPE r_cursor IS REF CURSOR;
    query_results r_cursor;
    results_out get_data_faster_row := get_data_faster_row(NULL, NULL, NULL);

    query_str VARCHAR2(4000);

    seq_number NUMBER;
    the_value VARCHAR2(10);
    the_item VARCHAR2(10);

BEGIN
    FOR i IN 1..in_seq_number.COUNT
    LOOP
        seq_number := in_seq_numbers(i);
        the_value := trim(in_values(i));
        the_item := trim(in_items(i));

        query_str := 'SELECT distinct '||seq_number||' as seq, value, item
        FROM my_table ai';                    

        query_str := query_str || '
        WHERE ai.value = '''||the_value||''' AND ai.item = '''||the_item||'''
        AND ai.param = ''BOOK''
        AND ai.prod in (' || list || ');

        OPEN query_results FOR query_str;

        LOOP
            FETCH query_results INTO 
                results_out.seq,
                results_out.value,
                results_out.item;
            EXIT WHEN query_results%NOTFOUND;
            PIPE ROW(results_out);
        END LOOP;

    CLOSE query_results;

    END LOOP;

END;

Extra info uit de onderstaande reactie van Alex nuttig voor het antwoord:




  1. Hoe bewaar ik statistieken voor mijn web-app?

  2. Laad gegevens van CSV naar mySQL-database Java+hibernate+spring

  3. Vergelijk twee MySQL-databases

  4. MySQL invoegen van een tekstgebied naar meerdere rijen