sql >> Database teknologi >  >> RDS >> Oracle

Looping på værdier, skabe dynamisk forespørgsel og tilføje til resultatsæt

En pipelinet tabelfunktion ser ud til at passe bedre til det, du ønsker, især hvis alt, hvad du gør, er at hente data. Se http://www.oracle-base.com/ articles/misc/pipelined-table-functions.php

Det du gør er at oprette en type til din outputrække. Så i dit tilfælde ville du oprette et objekt som f.eks.

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

Opret derefter en tabeltype, som er en tabel, der består af din rækketype ovenfor

CREATE TYPE get_data_faster_data IS TABLE OF get_data_faster_row;

Opret derefter din tabelfunktion, der returnerer dataene på en pipelinet måde. Pipelined i Oracle er lidt ligesom et udbytteafkast i .net (ikke sikker på, om du er bekendt med det). Du finder alle de rækker, du ønsker, og "piper" dem ud en ad gangen i en løkke. Når din funktion er færdig, består den returnerede tabel af alle de rækker, du har sendt ud.

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 nedenfor, har du brug for noget som dette. Jeg har ikke været i stand til at teste dette, men det burde få dig i gang:

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;

Ekstra info fra Alexs kommentar nedenfor nyttigt til svaret:




  1. slette duplikerede rækker og skal beholde en fra dem alle i mysql

  2. Bruger SSL til at oprette forbindelse til mySQL fra PHP

  3. Kan ikke oprette MySQL-trigger med TRIGGER-privilegium på 5.1.32

  4. Sådan kontrolleres radioknapper