Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Schleifen für Werte, Erstellen dynamischer Abfragen und Hinzufügen zur Ergebnismenge

Eine Pipeline-Tabellenfunktion scheint besser für das zu passen, was Sie wollen, insbesondere wenn Sie nur Daten abrufen. Siehe http://www.oracle-base.com/ article/misc/pipelined-table-functions.php

Was Sie tun, ist einen Typ für Ihre Ausgabezeile zu erstellen. In Ihrem Fall würden Sie also ein Objekt wie

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

Erstellen Sie dann einen Tabellentyp, bei dem es sich um eine Tabelle handelt, die aus Ihrem obigen Zeilentyp besteht

CREATE TYPE get_data_faster_data IS TABLE OF get_data_faster_row;

Erstellen Sie dann Ihre Tabellenfunktion, die die Daten per Pipeline zurückgibt. Pipelined in Oracle ist ein bisschen wie eine Ertragsrendite in .net (nicht sicher, ob Sie damit vertraut sind). Sie finden alle gewünschten Zeilen und "leiten" sie einzeln in einer Schleife aus. Wenn Ihre Funktion abgeschlossen ist, besteht die zurückgegebene Tabelle aus allen Zeilen, die Sie ausgegeben haben.

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;

BEARBEITEN:Nach dem Kommentar von Alex unten brauchen Sie so etwas. Ich konnte dies nicht testen, aber es sollte Ihnen den Einstieg erleichtern:

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;

Zusätzliche Informationen aus dem Kommentar von Alex unten, die für die Antwort nützlich sind: