sql >> Databasteknik >  >> RDS >> Oracle

Loopar på värden, skapar dynamiska frågor och lägger till resultatuppsättningen

En pipelined tabellfunktion verkar passa bättre för det du vill ha, speciellt om allt du gör är att hämta data. Se http://www.oracle-base.com/ articles/misc/pipelined-table-functions.php

Vad du gör är att skapa en typ för din utdatarad. Så i ditt fall skulle du skapa ett objekt som t.ex.

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

Skapa sedan en tabelltyp som är en tabell som består av din radtyp ovan

CREATE TYPE get_data_faster_data IS TABLE OF get_data_faster_row;

Skapa sedan din tabellfunktion som returnerar data på ett pipelinerat sätt. Pipelined i Oracle är lite som en avkastning i .net (inte säker på om du är bekant med det). Du hittar alla rader du vill ha och "pipar" ut dem en i taget i en slinga. När din funktion är klar består tabellen som returneras av alla rader du skickade ut.

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:Efter Alexs kommentar nedan behöver du något sånt här. Jag har inte kunnat testa detta men det borde få dig igång:

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 från Alexs kommentar nedan användbar för svaret:




  1. Gå med för att visa specifik data i frågebyggaren laravel

  2. php + mysql + google map

  3. Hur genererar man en HTML-sida dynamiskt med PHP?

  4. Mysql Regex för att ersätta 0 från ipv4