Oracle
 sql >> база данни >  >> RDS >> Oracle

Цикъл върху стойности, създаване на динамична заявка и добавяне към набор от резултати

Функцията за конвейерна таблица изглежда по-подходяща за това, което искате, особено ако всичко, което правите, е да извличате данни. Вижте http://www.oracle-base.com/ articles/misc/pipelined-table-functions.php

Това, което правите, е да създадете тип за вашия изходен ред. Така че във вашия случай бихте създали обект като

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

След това създайте тип таблица, която е таблица, съставена от вашия тип ред по-горе

CREATE TYPE get_data_faster_data IS TABLE OF get_data_faster_row;

След това създайте своя таблична функция, която връща данните по конвейерен начин. Конвейерът в Oracle е малко като връщане на доходност в .net (не съм сигурен дали сте запознати с това). Намирате всички редове, които искате, и ги „извеждате“ един по един в цикъл. Когато вашата функция завърши, таблицата, която се връща, се състои от всички редове, които сте извели.

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;

РЕДАКТИРАНЕ:След коментара на Алекс по-долу, имате нужда от нещо подобно. Не успях да тествам това, но трябва да ви помогне да започнете:

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;

Допълнителна информация от коментара на Алекс по-долу, полезна за отговора:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PreparedStatement въпрос в Java срещу Oracle

  2. Как да разрешите актуализиране на резултатите от изглед в Oracle?

  3. Каква е разликата между 'YYYY' и 'RRRR' в Oracle SQL

  4. Как да извикате функция на Oracle, която има SYS_REFCURSOR като OUT параметър

  5. Откриване на всички инсталирани версии на Oracle